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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高昌德 中级黑马   /  2014-11-5 13:53  /  1360 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1 = "abc";
String s2 = new String("abc");
s1和s2的区别,为什么是s1在内存中有一个对象,s2在内存中有两个对象?
1System.out.println(s1.hashCode());
2System.out.println(s2.hashCode());
1和2输出的结果为什么是相同的,hashCode()不是获取内存地址值得吗?
难道s1s2是相同的?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

8 个回复

倒序浏览
给你一个经典解答 ,传送门:http://bbs.itheima.com/forum.php?mod=viewthread&tid=150754
回复 使用道具 举报
       String s1=new  String("helloword");  先在堆内存中创建一个对象,并得到一个地址值(比如00010),然后在常量池中开辟一个空间,创建一个String对象为helloword,并得到一个地址值(比如00020),然后把00020传给00010,最后把00010传给s1
      String  s2=“helloWord"; 直接在常量池里开辟空间(其实先在常量寻找helloWord,如果有则把地址值传给s2,如果没有则开辟空间)
一目了然  他俩的地址值不可以一样

创建对象和直接赋值的区别.jpg (77.21 KB, 下载次数: 3)

创建对象和直接赋值的区别

创建对象和直接赋值的区别

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
s1==s2的话为FALSE
s1.equals(s2)为TRUE
前者比较的是两个对象,后者比较的是两个对象的字符串内容
回复 使用道具 举报
wf111sxwf 发表于 2014-11-5 14:53
给你一个经典解答 ,传送门:http://bbs.itheima.com/forum.php?mod=viewthread&tid=150754

表示很不解,是不是没有学习常量池,许多东西不知道
回复 使用道具 举报
字符串常量池你可以简单理解成 内存中专门存储字符串对象的一个空间。
回复 使用道具 举报
冷锋也温柔 发表于 2014-11-5 15:06
String s1=new  String("helloword");  先在堆内存中创建一个对象,并得到一个地址值(比如00010) ...

String s1 = new String("helloword");是不是s1找堆内存中的地址,堆内存中的地址找常量池中的地址,然后得到数据。
而String s2 = "helloword";直接到常量池中找数据。

回复 使用道具 举报
sk0806 发表于 2014-11-5 15:07
s1==s2的话为FALSE
s1.equals(s2)为TRUE
前者比较的是两个对象,后者比较的是两个对象的字符串内容 ...

这个还比较好理解
回复 使用道具 举报
高昌德 发表于 2014-11-5 15:45
String s1 = new String("helloword");是不是s1找堆内存中的地址,堆内存中的地址找常量池中的地址,然后 ...

是的  
s1==s2的话为FALSE  是因为==比较的是地址值
s1.equals(s2)为TRUE  是因为equals比较的是内容
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马