foreverxunyc
forever_cherry
2015-11-01 04:39
采纳率: 33.3%
浏览 2.2k
已采纳

Java中string类型在内存机制的存储问题

package chapter3;

public class RefAndAdd {
public static void main(String[] args) {
String str = "abc";
String str1 = "ab";
String str2 = str1 + "c";
String str3 = "a" + "b" + "c";
System.out.println(str == str2);
System.out.println(str == str3);
System.out.println(str2 == str3);
}
}

为什么输出结果是false,true,false

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • havedream_one
    havedream_one 2015-11-01 09:47
    已采纳

    有几个点:
    1、字符串常量("abc")会存在常量池中;
    2、编译的时候会优化代码,其中就有将"a" + "b" + "c"优化成“abc”,然后放在常量池中
    3、str1+"c"是在运行期决定的,所有相当于一个新的“abc”,而这个“abc”是堆内存中
    4、引用对象进行比较时使用equals,不能使用==,==只是单纯的比较值(对于引用对象而言,就会比较它的引用值---相当于一个地址)

    点赞 评论
  • qq_23068621
    红狼512 2015-11-01 09:06

    String类型的变量比较时不能用 ==号 需要调用equals函数来完成 比如 “ABC”.equals(a)

    点赞 评论
  • changhaozhe
    Rocket-Snail 2015-11-01 10:51

    str1 + "c"相当于调用了一个new产生了新的实例,我们知道一旦调用了new 不论String内容是否相同,在堆空间中都会开辟新的空间。
    "a" + "b" + "c" 这种形式没有调用new,此时字符串常量("abc")存在常量池中,当String内容相同时,在堆空间中不会开辟新的空间。

    点赞 评论
  • changhaozhe
    Rocket-Snail 2015-11-01 10:51

    str1 + "c"相当于调用了一个new产生了新的实例,我们知道一旦调用了new 不论String内容是否相同,在堆空间中都会开辟新的空间。
    "a" + "b" + "c" 这种形式没有调用new,此时字符串常量("abc")存在常量池中,当String内容相同时,在堆空间中不会开辟新的空间。

    点赞 评论
  • sunnyliqian
    sunnyliqian 2015-11-01 13:28

    str与str3指向同一引用“abc”,所以相等,但是str2与str、str3指向不同引用,其指向“ab”,所以不等。
    用==比较是比较双方的对象,而用equals函数则是比较双方的引用。
    可以参考:http://blog.csdn.net/zw_2011/article/details/6431448

    点赞 评论

相关推荐