String字符串常量池intern

https://blog.csdn.net/qq_31383041/article/details/73599436

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);  //不同

总结

  1. "23wfwf";这样是对pool中的引用,如果pool里面原来没有 就创建一个
  2. new String("1"); 首先在pool里面创建"1", 再在heap里面创建"1", 返回heap引用
  3. new String("1") + new String("1"); heap中生成11,返回heap中地址
  4. 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

你可能感兴趣的:(String字符串常量池intern)