java中的常量池

1.class常量池

在类编译的时候就创建了,保存在class文件中,保存类名,方法名等信息,是静态的

2.字符串常量池

在一篇文章中说的是1.7之前是保存在方法区。1.7之后是保存在堆中,因为方法区保存不下了。字符串常量池,顾名思义,就是保存String对象的,比如但我们

String a= "a"

这个时候,编译时,首先会在字符串常量池中去找有没有“a”这个值,如果有,这直接返回这个值的地址,如果没有,则会在常量池中新建一个“a”保存。

所以说,如果我们

String a = "a"
String b = "a"
while(a==b){
。。。
}

这样比较的话,a==b是会返回true的, == 是比较两个变量的地址,因为“a”在常量池中的地址是相同的,所以也就可以比较了。

但是如果是这样创建的话

String a = new String("a")

编译时,同样会在常量池中去找,没有就创建一个,并且,在运行时,jvm还会在堆中分类一个空间去保存"a",并且栈中的a保存的是现在在堆中的这个地址,所以如果这个时候用 == 号去比较的话,返回的就是false,因为两个保存的地址不同了。

字符串常量池中的值不会被gc垃圾回收装置清楚,因为好像有一个什么table,使每一个值都会有一个引用。

3.运行时常量池

保存在方法区,是可变的,动态存放运行时class常量池或者新的常量

世间种种的诱惑,不惊不扰我清梦
原文地址:https://www.cnblogs.com/javalisong/p/12213881.html