黑马程序员技术交流社区
标题:
求助:关于 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