栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一句话说明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的字面量值"常量池常量"存在于堆常量池里…

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836347.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号