三、运行时的动态常量(学习笔记)

public class Test {

    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");
        System.out.println(s1==s2);
        System.out.println(s1==s3);
        System.out.println(s1==s3.intern());
        System.out.println(s3==s4);
    }



}

代码执行的结果:

  true
  false
  true
  false

 

出现上面的

 

结果的解释如下图

  

 

     任何一个字符串的创建都会扔到常量池中,常量池是方法区的一块存储空间

     通过new 创建的对象会放到堆上

     == 比较的对对象的内存地址

     String 在常量池中存储的数据结构类似一个HashSet ,里面存储的是无序 不重复的字符串,所以两个“abc” 放入到里面存储的是一个

     s3 和 s4 是通过new创建的对象,所以放入到堆中,所以两个对象的内存地址不一样。

     而 通过 s3.intern() 这个方法,可以将s3从堆内存中放入到常量池中,所以进行比较的时候两个对象的地址是一样的。

    

     

 

posted @ 2019-08-20 10:08  梅花GG  阅读(308)  评论(0编辑  收藏  举报