美文网首页
String字符串常量池intern

String字符串常量池intern

作者: 胖达_4b7e | 来源:发表于2019-03-09 16:24 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/nwespqtx.html