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常量池或者新的常量
世间种种的诱惑,不惊不扰我清梦