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