一句话说明java常量池及其存储的对象

    java虚拟机内存结构有了堆、栈、方法区,那么这个常量池又是个什么东东,为何又突然想到常量池这个概念呢,是因为面试官有一问,String a=new String("常量池常量"),这行代码中的对象在内存里是怎么分配的,平时都问框架问并发问什么的,这么基础的知识点突然一问不免很上头,也侧面反应了我对基础底层的知识理解还不够,然后后来翻资料,自己概括是这样的,申明一个字符串对象a,String a;这个还没实例化也就是还没new值"常量池常量"的对象a是存放在栈中(实例化new后,会在堆中开辟一块内存存放对象a,而对于对象a的引用指向依然存在于栈中,当栈对a的引用指向删除后,堆也会删除对象a),然后给值"常量池常量"这个字面量值会先在常量池中查找,如果找到就将a的指引指向存"常量池常量"这个字面量,如果没找到,也将这个字面量存储于常量池中,再将a的指引指向在"常量池常量"这个字面量,如果是String a="常量池常量",那么数据对象又是怎么存储于内存的呢,少了实例化new这一步,那么就不会在堆中开辟一个对象a的内存,而是只在栈中存在a的指引,然后把这个指引指向字面量"常量池常量";于是就有了新的问题,"常量池常量"为什么不存在堆、栈、方法区而是存在常量池里,常量池又是个什么东东,下面来解释,常量池是不同于堆、栈、方法区的特殊存储区域,目前jdk1.7开始,常量池分别在方法区和堆中各划分一块内存区域,方法区中的常量池主要存储class编译加载时字节码中产生的常量已及java运行时的字面量符号引用等,而堆常量池主要存储字符串常量,所以,一句话解释面试官的这个问题就是,对象a存在于堆里,而对对象a的引用存在于栈中,对象a的字面量值"常量池常量"存在于堆常量池里…

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值