1.String 中的intern() 方法?
1.1 首先,在jdk7以前,常量池不在堆中,jdk7以及以后的版本常量池在堆中;
1.2
String str1 = "hello"; //在常量池中
String str2 = "hello"; //在常量池中
System.out.println(str1 == str2);//true
1.3 String a = new String("abc"); //在堆中创建对象,然后判断常量池中是否有“abc”,如果已存在,不创建,不存在的话在常量池创建“abc”
1.4 jdk1.6及其之前的intern()方法
在JDK6中,常量池在永久代分配内存,永久代和Java堆的内存是物理隔离的,执行intern方法时,如果常量池不存在该字符串,虚拟机会在常量池中复制该字符串,并返回引用;如果已经存在该字符串了,则直接返回这个常量池中的这个常量对象的引用。所以需要谨慎使用intern方法,避免常量池中字符串过多,导致性能变慢,甚至发生PermGen内存溢出。
1.5 jdk1.7的intern()方法
JDK 1.7后,intern方法还是会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用,这一点与之前没有区别,区别在于,如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引用。简单的说,就是往常量池放的东西变了:原来在常量池中找不到时,复制一个副本放到常量池,1.7后则是将在堆上的地址引用复制到常量池。
未完待续。。。