黑马程序员技术交流社区

标题: String类的疑惑,求解决,, [打印本页]

作者: 高昌德    时间: 2014-11-5 13:53
标题: String类的疑惑,求解决,,
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是相同的?


作者: 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对象为helloword,并得到一个地址值(比如00020),然后把00020传给00010,最后把00010传给s1
      String  s2=“helloWord"; 直接在常量池里开辟空间(其实先在常量寻找helloWord,如果有则把地址值传给s2,如果没有则开辟空间)
一目了然  他俩的地址值不可以一样

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

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

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

作者: sk0806    时间: 2014-11-5 15:07
s1==s2的话为FALSE
s1.equals(s2)为TRUE
前者比较的是两个对象,后者比较的是两个对象的字符串内容
作者: 高昌德    时间: 2014-11-5 15:40
wf111sxwf 发表于 2014-11-5 14:53
给你一个经典解答 ,传送门:http://bbs.itheima.com/forum.php?mod=viewthread&tid=150754

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

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


作者: 高昌德    时间: 2014-11-5 15:46
sk0806 发表于 2014-11-5 15:07
s1==s2的话为FALSE
s1.equals(s2)为TRUE
前者比较的是两个对象,后者比较的是两个对象的字符串内容 ...

这个还比较好理解
作者: 冷锋也温柔    时间: 2014-11-6 12:57
高昌德 发表于 2014-11-5 15:45
String s1 = new String("helloword");是不是s1找堆内存中的地址,堆内存中的地址找常量池中的地址,然后 ...

是的  
s1==s2的话为FALSE  是因为==比较的是地址值
s1.equals(s2)为TRUE  是因为equals比较的是内容




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