首先常量池分为类编译后的常量池和运行时常量池
类的常量池为类编译后生成的 Constant pool:
在代码运行时会将 上面 Constant pool 的内容加载到方法区(perm jdk1.8以后是metaspace)生成运行时常量池
运行时常量池。
关于String类型,如String a = "a" 在代码运行时会先初始化到 SymbolTable符号表中(在方法区) 运行这行代码时
将常量 a 拷贝到 堆中使用。
这里有两个问题
1、 多个类定义了 String a="a" 这个字符串 在SymbolTable中只占一个内存空间 (来自笨神)
2、 多个类调用 String a= "a" 这条语句 只生成一个对象(1.7以后在堆中)
例:
String a="a"
String b="a"
System.out.println(a==b) //true