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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄嵘才 中级黑马   /  2013-1-15 16:46  /  2175 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 11:04 编辑

Java代码


  • String s = new String(“abc”);
  • String s1 = ”abc”;
  • String s2 = new String(“abc”);
  • System.out.println(s == s1);
  • System.out.println(s == s2);
  • System.out.println(s1 == s2);

/*结果
false
false
false
*/
我原先认为结果是:
true
true
false
因为都指向内存的abc.
请解惑。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

5 个回复

倒序浏览
这个是String的特性不管你是写String s = "abc' 还是String s1 = new String"abc"他们都是new操作。剩下的你自己想。
回复 使用道具 举报
本帖最后由 陈丽莉 于 2013-1-15 17:18 编辑

      因为String s=new String(“abc”)是在内存中创建对象abc,再创建一个String对象s指向abc。(不存在查找是否有abc这个字符串的过程),所以和new相比的字符串都是false的。
    而String s1=“abc”;是创建一个字符串对象s1后,先在string池里面查找是否有abc,若有,指向它,若没有,则在string池中新建abc并让s1指向它,所以这里的s和s2都为内存中的abc,地址都不相同。
    如果在楼主代码的基础上添加String s3=“abc”;和System.out.println(s3==s1);则s3会先在string池中寻找是否有abc,发现后将其地址(也就是s1指向的地址)存入s3,所以结果为true。

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1

查看全部评分

回复 使用道具 举报
陈丽莉 发表于 2013-1-15 17:17
因为String s=new String(“abc”)是在内存中创建对象abc,再创建一个String对象s指向abc。(不存 ...

这个解释比较到位。
回复 使用道具 举报
本帖最后由 夏晓彤 于 2013-1-15 18:08 编辑

第一句执行后内存中有两个对象,而不是一个。一个由new String("abc")中的"abc"在String Pool里生成一个值为"abc"的对象;第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝。变量s最后指向堆中产生的"abc"对象;
第二句执行时,s1先去String Pool找是否有值为"abc"的对象,很显然在上一步中java已经在String Pool里生成一个"abc"对象了,所以s1直接指向String Pool中的这个"abc";
第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个"abc"对象,这与执行第一句后生成的"abc"是不同的两个对象,s2最后指向这个新生成的对象。
因此,执行后面的打印语句的结果是三个false
回复 使用道具 举报
引用类型只要用new 实例化 就会重新分配内存空间,产生新的对象,用==比较引用类型表示他们的内存地址必须相等,由于分配了新的内存空间,所以内存地址不同故用为false
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马