黑马程序员技术交流社区

标题: 关于new一个对象的疑问 [打印本页]

作者: 张青峰    时间: 2012-2-2 20:56
标题: 关于new一个对象的疑问
本帖最后由 张青峰 于 2012-2-8 18:08 编辑

有这样一段程序:
String str1=new String("hello");
String str2=new String("hello");

我是初学者,请问高手们:为什么str1和str2在堆中的位置是一样的,不是说new一个对象就会在堆中新产生一个内存区域?谢谢
作者: 彭嘉聪    时间: 2012-2-2 21:11

  1. class testing2
  2. {
  3.         public static void main(String []args){
  4.                 String s1 = new String("123");
  5.                 String s2 = new String("123");

  6.                 System.out.println(s1 == s2);
  7.         }
  8. }
复制代码
输出是false
两对象是不相等的,但是“123”是相等的
看图

作者: 彭嘉聪    时间: 2012-2-2 21:15

  1. class testing2
  2. {
  3.         public static void main(String []args){
  4.                 String s1 = new String("123");
  5.                 String s2 = new String("123");
  6.                 String s3 = "123";
  7.                 String s4 = "123";

  8.                 System.out.println(s1 == s2);
  9.                 System.out.println(s3==s4);
  10.         }
  11. }
复制代码
怕你还是不明白,这个输出是
false
true
作者: Joyuang    时间: 2012-2-2 21:24
因为你new出来的是字符串常量,字符串常量一样,在堆中地址当然一样,只是在栈中的引用不同。
ps:地铁13号线上手机回帖,悲催的大晚上往回走。
作者: 易伟    时间: 2012-2-2 21:48
彭嘉聪 发表于 2012-2-2 21:11
输出是false
两对象是不相等的,但是“123”是相等的
看图

强大啊,描述准确@
作者: 张伟~    时间: 2012-2-2 21:49
本帖最后由 张伟~ 于 2012-2-2 21:57 编辑

我去谁说位置一样的,new出来的对象内存地址都是不同的,两个hello分配了各自的内存
String str1="hello";
String str2="hello";
这时才str1==str2,因为执行第一句话时,字符串池中如果没有hello这个字符串,则在池中生成hello,执行第句话时,则是直接把字符串池中已有的字符串"hello"直接赋给身str2
作者: 彭嘉聪    时间: 2012-2-2 21:50
本帖最后由 彭嘉聪 于 2012-2-2 21:51 编辑

回复错了添,郁闷
作者: 易伟    时间: 2012-2-2 22:02
本帖最后由 易伟 于 2012-2-2 22:05 编辑

我也来讲讲见解:
String str1=new String("hello");
String str2=new String("hello");
这里面涉及到常量池、堆、栈
首先检测常量池中有无字符串"hello",没有就创建一个,然后把它复制一份放进你在堆中创建的对象
有,就直接把它复制一份放进你在堆中创建的对象
String str1=new String("hello");因为使用了new运算符,所以在堆中会创建一个对象str1
String str2=new String("hello");");因为使用了new运算符,所以在堆中会创建一个对象str2
显然这两个对象的地址不一样,因此用==比较时,返回false,注意==比较的地址值而不是地址中的内容


作者: 张青峰    时间: 2012-2-2 22:42
谢谢 原来如此{:soso_e113:}




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