这篇文章
由常量池 运行时常量池 String intern方法想到的(三)之String内存模型 有网友评论,主要有以下两个问题:
(1)是不是每个类都有一个运行时常量池?
(2)在运行时常量池中存在的字符串是否是对象?
下面主要以示例的形式解释第一个问题,而第二个问题,我之前也有过疑惑,也问过其他网友,请看这个博文及评论:
String放入运行时常量池的时机与String.intern()方法解惑
是不是每个类都有一个运行时常量池?
不是每个类都有一个运行时常量池。
请看下面的例子:
Constant1.java
package org.fan.learn.string;
/**
* Created by fan on 2016/10/8.
*/
public class Constant1 {
public void test() {
//String s1 = new String("12") + new String("3");
//s1.intern();
String s2 = new String("123");
System.out.println(s2);
}
public static void main(String[] args) {
Constant1 constant1 = new Constant1();
Constant2 constant2 = new Constant2();
constant1.test();
constant2.test2();
}
}
Constant2.java
package org.fan.learn.string;
/**
* Created by fan on 2016/10/8.
*/
public class Constant2 {
public void test2() {
String s = new String("123");
System.out.println(s);
}
}
加断点之后,看Constant1中s2的“123”地址和Constant2中s的“123”的地址:
从上图可以看到,字符串对象”123”的地址都是461,所以不同的类其实使用的是同一个运行时常量池。
而且,运行时常量池是方法区的一部分,而方法区是所有线程共享的。