黑马程序员技术交流社区

标题: 求助:关于 new String("abc") 在内存中开辟两个内存空间的问题 [打印本页]

作者: 蔡增辉    时间: 2013-5-11 21:30
标题: 求助:关于 new String("abc") 在内存中开辟两个内存空间的问题
本帖最后由 蔡增辉 于 2013-5-12 10:59 编辑

代码如下:  
  String str3=new String("abc");
  String str1="abc";
  String str2="abc";
  System.out.println(str1==str2);  //输出结果为true
  System.out.println(str1==str3);  //输出结果为false

问题:
String str3=new String("abc") 这句话开辟了两个内存空间,str3所指向的空间,导致System.out.println(str1==str3)输出结果为false;
则另外一个空间与str1所指向的是同一个空间吗?

即: str1 所指向的空间是又重新开辟了一个,还是指向了new String("abc") 开辟的另外一个空间?
作者: Jacky_Chen1990    时间: 2013-5-11 21:39
  String str1="abc";
  String str2="abc";

这两句是指向一个空间的。
如果你用了new 则她会强制性的开辟一个新的空间。
因此返回了一个false.
str2 == str3 也会返回false;
作者: 蔡增辉    时间: 2013-5-11 21:40
尹桥印 发表于 2013-5-11 21:33
脑袋突然就被你那样问给问蒙了。。

呵呵,表达可能有点不太清晰,多谅解;
作者: Jacky_Chen1990    时间: 2013-5-11 21:49
补充一下,这个需要理解堆和栈的知识。
作者: 仲伟    时间: 2013-5-11 22:40
new  出一个String("abc");
Str 指向新 new出的String
作者: 花开花落总相似    时间: 2013-5-12 07:03
String str3=new String("abc");        //这里在堆内存中new出来一个对象  但是呢 这个对象也指向 data segmen里面的abc  
  String str1="abc";              //这里在 data segment 里面开辟一个空间  里面是abc
  String str2="abc";              //   data segment里面会自动有一个优化功能 当里面有相同的字符就不在开辟空间  str2也指向 str1 开辟的那个空间
  System.out.println(str1==str2);  //输出结果为true            //这里必须为真 指向同一个 你说呢
  System.out.println(str1==str3);  //输出结果为false           //  这里是一个引用比较的对象不同 当然为false了
       其中 str3  开辟的一个空间是在 堆内存中 str3 这个引用指向堆内存 然后 这个空间又会指向 data segment中的  abc  所以你也可以理解为开辟了两个空间

作者: 小陈期待逆袭    时间: 2013-5-12 08:50
学习了。呵呵
作者: 刘胜寒    时间: 2013-5-12 10:34
楼主此贴。。在十九期有同样的问题。。
我在纠结给不给你分。。
看楼下有几个回答的是那么回事。。。


String str3=new String("abc")  是开辟两个空间,当调用new String()方法时,jvm会现在常量池中创建一个字符串“abc”,然后再堆内存中创建一个字符串,所以是创建两个对象。
str3 指向的是堆内存中的“abc”变量,而str1和str2指向的是常量池中间的变量。
str1,2,3的hashCode全部一致。因为String类复写了HashCode方法。
可以用System.identityHashCode()来查找他们在内存中唯一的内存地址。

问题如果以解决,请及时修改分类,否则继续提问问,谢谢合作!




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