声明String 字符 和new String 的区别是什么.?
String a="a";
String b=new String("a");
String c=new String("a");
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
执行的结果是 :
97
97
97
我的理解 b c的hashCode 不应该相等啊. 因为 b c在堆内存里各创建了两个对象.只是加入了对"a"常量字符的引用而已.
------解决方案--------------------String的equal 和 hashCode 都重写了。
所以一样。b和c,equal的话,一样; == 才不一样
------解决方案--------------------==的话看指向的地址
------解决方案--------------------一、Object类的api文档是这么约定的:如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
二、String类重写了equal hashCode方法。
三、equal结果为true,所以hashCode一定相同,
------解决方案--------------------1、当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,挡在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。
2、重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。
3、Ojbect类的hashCode方法返回的是Object对象的内存地址。可以通过Integer.toHexString(new Object().hashCode);来得到
------解决方案--------------------这个 必须的不一样啊·····
首先··String 直接赋值是给变量一个存在栈中德字符
new String 是 新的一个对象对这个变量的引用只是调用了内存中的地址····
两个是不通的概念啊··后者对象 前者是各变量
------解决方案--------------------看String类型的hashCode()源码就会发现,这个与Object的hashCode()方法不是一个概念,重构了,根据输入来计算,同一个输入的值,当然返回的值也是一样的。跟存储一点关系都没有。
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
------解决方案--------------------String s = new String("a");实际上市创建了两个对象,一个是字符串对象"a",是放在内存的字符存储区的
另一个是new String("a")对象
------解决方案--------------------查看String类hashCode()方法源码,发现其计算方法是根据字符串字面值逐个求和得到,故相等的字符串字面值的hashCode值比然相等。
------解决方案--------------------hashCode相同,他们是两个内容相同的不同对象,a,b,c分别是一个内容为“a”的String对象的指针(句柄),他们指向的地址是不同的,你可以试着写下这么几句:
Java code
System.out.println(a == b);
System.out.println(a.equals(b));