String字符串常量池intern
2019-03-09 本文已影响0人
胖达_4b7e
1.7及以上为准
字符串常量池在堆中
String str1 = new String("SEU")+ new String("Calvin"); // SEUCalvin 产生在堆中
System.out.println(str1.intern() == str1); // 池中存储堆中SEUCalvin 的引用
System.out.println(str1 == "SEUCalvin"); //都是heap的地址
true
true
上面加一行
String str2 = "SEUCalvin";//在池中产生SEUCalvin ,指向它
false
false
这是因为加这么一句以后,pool里面已经有了这个字符串, 不再存储堆中的引用
String s = new String("1"); //常量池生成"1", 堆中生成"1",返回堆中地址
String s2 = "1"; //指向常量池中
s.intern(); //常量池本来就有它 没影响
System.out.println(s == s2); //不同
String s3 = new String("1") + new String("1"); //堆中生成"11", 指向它
String s4 = "11"; //常量池中生成 指向它
s3.intern(); //常量池本来就有它 没影响
System.out.println(s3 == s4); //不同
JDK1.7以及以上:false false
String s3 = new String("1") + new String("1"); //堆中生成"11" ,指向它
s3.intern(); //常量池中 生成指向堆中"11"的引用
String s4 = "11";
System.out.println(s3 == s4); //相同
在JDK1.7中,常量池中不需要再存储一份对象了,可以直接存储堆中的引用。这份引用直接指向 s3 引用的对象,也就是说s3.intern() ==s3
会返回true。
String s3 = new String("1") + new String("1"); //堆中生成"11" ,指向它
String s4 = "11"; //常量池中生成"11",指向它
s3.intern(); //没作用
System.out.println(s3 == s4); //不同
总结
-
"23wfwf";
这样是对pool中的引用,如果pool里面原来没有 就创建一个 -
new String("1");
首先在pool里面创建"1", 再在heap里面创建"1", 返回heap引用 -
new String("1") + new String("1");
heap中生成11,返回heap中地址 -
s3.intern
pool有这个字符串,则返回地址,如果没有 pool里面存heap中这个字符串的地址,返回这个地址
String常见题
1.Select all the interfaces implemented by String class.
Cloneable×
CharSequence
Comparable
Serializable
public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
}
}
false
注意运算符优先级
String s1 = new String("pankaj");
String s2 = new String("PANKAJ");
System.out.println(s1 = s2);
要看清
输出:PANKAJ