方法区和永久代
方法区:是JVM的一种规范,存放类信息、常量、静态变量、即时编译器编译后的代码等;
永久代:是HotSpot的一种具体实现,实际指的就是方法区
常量池和永久代
jdk1.6及之前版本:常量池分配在永久代中
jdk1.7之后:常量池分配在java堆中
String#intern()方法
intern方法会先去查询常量池中是否有字符串已经存在,如果存在,则返回常量池中的引用,这一点jdk1.6、jdk1.7一样
区别在于,如果在常量池找不到对应的字符串:
jdk1.6 会再将字符串拷贝到常量池,返回指向常量池的引用。
jdk1.7 则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串(java堆中)的引用。
简单的说,就是往常量池放的东西变了:原来在常量池中找不到时,复制一个副本放到常量池,1.7后则是将在堆上的地址引用复制到常量池。
String对象与常量池
java
1 | /*String s1 = new String(“abc”)做了如下事情: |
java
1 |
|





