黑马程序员技术交流社区

标题: 关于String常量池和== [打印本页]

作者: 孙晋学    时间: 2013-3-18 13:02
标题: 关于String常量池和==
本帖最后由 孙晋学 于 2013-3-18 13:37 编辑

String s1 = "abc";
常量池存在于方法区中,编译时期"abc"被当作常量。
String s2 = new String("abc");
运行时在堆区中创建对象,s2指向这个地址
s1==s2在比较引用类型时,是判断两者是否为同一个对象,那就是比较两者的内存地址是否一样?
但是s1.hashcode()和s2.hashcode()是相等的。
作者: 王军行    时间: 2013-3-18 13:29
s1和s2的对象都是“abc” 不过s2是新开辟了个空间存入常量“abc”罢了  你这样写就是“abc”.hashcode()和“abc”。hashcode() 当然一样啊
s1==s2在比较引用类型时,比较的是引用地址值。不是判断是否是同一个对象。equals才是判断对象是否相同

作者: 孙晋学    时间: 2013-3-18 13:38
王军行 发表于 2013-3-18 13:29
s1和s2的对象都是“abc” 不过s2是新开辟了个空间存入常量“abc”罢了  你这样写就是“abc”.hashcode()和 ...

谢谢。。。
作者: 黑马-王鹏    时间: 2013-3-18 13:46
String s2 = new String("abc");其实只创建了一个对象,因为String s1 = "abc";创建了一个String对象,对象内容"abc"在方法区中,当String s2 = new String("abc");创建
的String内容"abc"直接在方法区中调用,其实就是将"abc"的首地址赋予s2,而且s1中的内容也是"abc"的首地址,因为s1==s2比较的是对象中的首地址,所以s1.hashcode()和s2.hashcode()是相等的。
作者: 123    时间: 2013-3-18 14:10
字符串的hash值是根据字符串的值计算的,相同值的字符串对象hash值一定相同,具体的计算方法在jdk的文档中有描述。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2