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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 蔡增辉 于 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") 开辟的另外一个空间?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

9 个回复

倒序浏览
  String str1="abc";
  String str2="abc";

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

呵呵,表达可能有点不太清晰,多谅解;
回复 使用道具 举报
补充一下,这个需要理解堆和栈的知识。
回复 使用道具 举报
new  出一个String("abc");
Str 指向新 new出的String
回复 使用道具 举报
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 10:34

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
学习了。呵呵
回复 使用道具 举报
楼主此贴。。在十九期有同样的问题。。
我在纠结给不给你分。。
看楼下有几个回答的是那么回事。。。


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

问题如果以解决,请及时修改分类,否则继续提问问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马