A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙晋学 中级黑马   /  2013-3-18 13:02  /  1447 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙晋学 于 2013-3-18 13:37 编辑

String s1 = "abc";
常量池存在于方法区中,编译时期"abc"被当作常量。
String s2 = new String("abc");
运行时在堆区中创建对象,s2指向这个地址
s1==s2在比较引用类型时,是判断两者是否为同一个对象,那就是比较两者的内存地址是否一样?
但是s1.hashcode()和s2.hashcode()是相等的。

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

4 个回复

倒序浏览
s1和s2的对象都是“abc” 不过s2是新开辟了个空间存入常量“abc”罢了  你这样写就是“abc”.hashcode()和“abc”。hashcode() 当然一样啊
s1==s2在比较引用类型时,比较的是引用地址值。不是判断是否是同一个对象。equals才是判断对象是否相同
回复 使用道具 举报
王军行 发表于 2013-3-18 13:29
s1和s2的对象都是“abc” 不过s2是新开辟了个空间存入常量“abc”罢了  你这样写就是“abc”.hashcode()和 ...

谢谢。。。
回复 使用道具 举报
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()是相等的。
回复 使用道具 举报
字符串的hash值是根据字符串的值计算的,相同值的字符串对象hash值一定相同,具体的计算方法在jdk的文档中有描述。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马