hashCode() 和 == 的问题?
源码:public class NewTest {
public static void main(String[] args) {
String s1 = "test";
String s2 = new String("test");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s1 == s2);
}
}
运行结果:
3556498
3556498
false
为什么hashCode码相同,而==是false。
----------------解决方案--------------------------------------------------------
哎...Java是引用类型懂不?
----------------解决方案--------------------------------------------------------
回复 2楼 peach5460
知道啊,hashCode返回的不是地址吗? == 又是比较的地址,为什么会是false??? ----------------解决方案--------------------------------------------------------
String s1 = "test";
String s2 = new String("test");
你觉得这两个地址怎么可能一致
不false难道true啊
----------------解决方案--------------------------------------------------------
回复 4楼 peach5460
那为什么hashCode值相等,hashCode值不是内存地址吗? ----------------解决方案--------------------------------------------------------
hashcode 返回的不是地址,而是经过地址运算后产生的一个数
----------------解决方案--------------------------------------------------------
回复 6楼 husiwen
明白了,谢谢! ----------------解决方案--------------------------------------------------------
String s1 = "test";
String s2 = new String("test");
hashcode()是根据经过一些列的加减乘除计算出的一个整数,我们来计算hashcode的值一般根据传入的数据转换为整数后乘以31的到的整数,你传入的都是test所以hashcode的值是相等的,
==是比较的两个内存地址,在内存中的存储情况是:"test"在对象池中,但 new String()创建的对象在堆中存储,在该对象里又有一个引用,指向了对象池中的中一个"test",所以==的结果是false
则s1.equals(s2)是比较的s1,s2的内容,结果是true,因为String类中覆盖了父类equals()方法,
[ 本帖最后由 ming10086 于 2013-9-11 22:32 编辑 ]
----------------解决方案--------------------------------------------------------
用s1.equals(s2)
----------------解决方案--------------------------------------------------------
受教了
----------------解决方案--------------------------------------------------------