String和常量池

来源:互联网 发布:mysql cve 2016 6662 编辑:程序博客网 时间:2024/05/21 11:04

jdk1.6之前常量池属于永久代,jdk1.7以后移到堆中。

String s1 = "abc";// 放在常量池中        String s2 = "abc";// 从常量池中查找        String s3 = new String("abc");//new放在堆中        String s4 = new String("abc");        String s5 = s1.intern();        String s6 = s3.intern();        System.out.println(s1 == s2);        System.out.println(s1 == s3);        System.out.println(s1 == s5);        System.out.println(s1 == s6);        System.out.println(s3 == s4);        System.out.println("==================");        System.out.println(s1.equals(s2));        System.out.println(s1.equals(s3));        System.out.println(s1.equals(s5));        System.out.println(s3.equals(s4));


==:比较引用地址一样

equals:比较的是两个对象的内容是否一样

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。


String.intern()方法获得在常量池中的字符串引用,如果常量池中没有则会将字符串加入,然后将该引用放入list持有
确保不会被回收,jdk报错permgem space发生在永久代 jdk7报错 java heap space发生在堆

List<String> list = new ArrayList<>();        int i = 0;        while (true) {            list.add(String.valueOf(i++).intern());        }


0 0