字符串池内存分配

时间:2015-03-12 07:18:01

标签: java string string-pool

String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));

打印:

  


  真

任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

String s="abc"; // goes to string constants pool
String s4 = s +"" ;// has value "abc" but goes on heap and not in string constants pool
System.out.println(s4==s);//well,, the references are not equal. There are 2 diffrent instances with value="abc"
System.out.println(s4.equals(s)); // equals() checks for value and the values of both insatnces are equal.

答案 1 :(得分:1)

以下是您在评论中输出的代码 -

String s="abc";
String s4 = s +"" ;
System.out.println(s4==s); //false
System.out.println(s4.equals(s)); //true  

第一个是false,因为它正在检查s4s的引用。由于这两个引用不同,因此评估为false。这里==(相等)运算符在应用于引用类型时用于检查两个引用是相同还是不同。

equals()是一种方法,它是通过对象类中的每个引用类型实现的。您可以覆盖自己类的equals()方法。

equals(s)方法用于检查两个对象是否有意义等于。对于String类,有意义的等于意味着两个比较字符串相同但它们的引用可能不同。 String类已经覆盖equals()方法,因此您无需自行覆盖equals()方法。

现在要了解字符串池概念,请考虑以下代码段 -

String s5 = s;
System.out.println(s5); //abc
System.out.println(s5==s); //true
System.out.println(s5.equals(s)); //true

此处s5==s评估为true。因为s5没有引用新的String对象。它引用了s池中现有的String对象(即string引用的“abc”)。现在,引用s5s4都是等于。在最后一个语句中,s5和s有意义地等于,因此s5.equals(s)被评估为true

希望它会有所帮助 非常感谢。