• 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常量池或者新的常量

    世间种种的诱惑,不惊不扰我清梦
  • 相关阅读:
    kafka 常见面试题
    分布式-redis实现分布式锁
    java info信息中打印异常堆栈
    11.盛水最多的容器
    445.两数相加
    328. 奇偶链表
    7中join查询
    Linux基础学习05
    Linux基础学习04
    Linux基础学习03
  • 原文地址:https://www.cnblogs.com/javalisong/p/12213881.html
Copyright © 2020-2023  润新知