关于声明String和StringBuilder对象hashCode的问题
StringBuilder a = new StringBuilder("a");StringBuilder b = new StringBuilder("a");
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println("-----------------");
String aa = new String("aa");
String bb = new String("aa");
System.out.println(aa.hashCode());
System.out.println(bb.hashCode());
System.out.println(aa==bb);
System.out.println(aa.equals(bb));
结果:
78236
6301159
false
false
-----------------
3104
3104
false
true
结果发现:
StringBuilder声明的对象hashCode值不同。String 声明的对象HashCode值相同。故 a.equals(b)为flase,aa.equals(bb)true;
a==b;aa==bb;两者为flase是因为==比较的是对象的值,每new一次。创建一个新值所以为flase;
但为什么StringBuilder声明的对象hashCode值不同呢?有人能帮我解释下吗?
----------------解决方案--------------------------------------------------------
明白了:
查看StringBuilder 和String 的equals内部方法就知道了。
StringBuilder 里继承了Object里的equals方法。比较的是引用值
如下:
public boolean equals(Object obj) {
return (this == obj);
}
String覆盖了Object的equals方法如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
----------------解决方案--------------------------------------------------------
理解一下stringbuilder是做什么用的
如果只是new一个字符串还是用new String吧
stringbuilder是用来字符串拼接的,效率上高于string的+号运算
既然是拼接,那么stringbuilder的hashcode自然就不应该一致
----------------解决方案--------------------------------------------------------