在运行的时候常量池里的符号都会被加载导运行时常量池这时候还没有变成字符串对象 当运行到被调用的方法上被调用了才会变成字符串对象才会将符号引用转变为直接引用的,这时候准备了StringTable 把字符串对象看作key寻找StringTabble中是否有相同的值,如果串池里没有则添加进去。用到时候才会去添加进去不是提前准备在StringTable中的
StringTable又称StringPool又称串池 String table中存储的并不是String类型的对象,存储的是指向String对象的索引,真实对象还是存储在堆中。
可以使用intern方法,主动将串池中还没有的字符串对象放入串池
class文件常量池和运行时常量池的关系以及区别
class文件常量池存储的是当class文件被java虚拟机加载进来后存放在方法区的一些字面量和符号引用,字面量包括字符串,基本类型的常量。
运行时常量池是当class文件被加载完成后,java虚拟机会将class文件常量池里的内容转移到运行时常量池里,在class文件常量池的符号引用有一部分是会被转变为直接引用的,比如说类的静态方法或私有方法,实例构造方法,父类方法,这是因为这些方法不能被重写其他版本,所以能在加载的时候就可以将符号引用转变为直接引用,而其他的一些方法是在这个方法被第一次调用的时候才会将符号引用转变为直接引用的。
总结:
方法区里存储着class文件的信息和运行时常量池,class文件的信息包括类信息和class文件常量池。
运行时常量池里的内容除了是class文件常量池里的内容外,还将class文件常量池里的符号引用转变为直接引用,而且运行时常量池里的内容是能动态添加的。例如调用String的intern方法就能将string的值添加到String常量池中,这里String常量池是包含在运行时常量池里的,但在jdk1.8后,将String常量池放到了堆中。
https://blog.csdn.net/qq_26222859/article/details/73135660
String str = “a” str==”a”返回什么 ,两个对象什么情况下用==返回true。
返回true
Class文件加载完后会把常量池中的符号加载到运行时常量池,当被符号a调用到之后会变成‘a’字符串对象,在这个过程中先把‘a’看成key去StringTable中寻找是否有相同的值,如果没有就会添加进去,执行完String str = “a”,StringTable中已经存在了字符串对象’a’的引用,执行str==”a”时同样会去找判断“a”是否在StringTable中,这时候Stringtable中已经有了“a”的引用,所以得到