String s = new String("abc");
内存中产生两个对象,一个在String Pool里面,另一个在堆里面生成一个。s 引用堆里面的对象。
String s1 = "abc";
先从String Pool里查找是否有“abc”的对象,有则直接返回引用。
String s2 = new String("abc");
内存中产成一个对象,由于StringPool里面已经有了一个“abc”对象,则直接在堆中再创建一个“abc”对象返回引用给s2。
s == s1
s == s2
s1 == s2
String == 比较对象的引用,由于现在s ,s1 ,s2现在分别指向了三个引用地址,所以会是返回三个 false。
字符串相等性比较 JDK1.6 原生中文文档
intern
public String intern()
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。
返回:
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
s1 == s1.intern(); //这时候s1 和 s1.intern() 都返回StringPool池中的对象,所以true
s.intern() == s2.intern(); //s.intern()去池中查找,发现有相同值对象返回StringPool里的对象,s2.intern()也可以从StrngPool池中找到,所以都返回StringPool池中引用,true。
------------------------------------------------------------------------------------------------
String hello = “hello”;
String hel = "hel";
String lo = "lo";
hello == "hel" + "lo"; //true 两个字面常量值 直接 + 号连接,会直接拼成 完整的字符串去StringPool中查找,所以true。
hello == "hel" + lo; //false +号左右 有一个不是常量值,则会在堆中新建立出来一个对象,所以false