String和常量池

    xiaoxiao2021-12-14  19

    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()); }

    转载请注明原文地址: https://ju.6miu.com/read-962939.html

    最新回复(0)