JAVA基本类型变量和常量池的关系

通常都认为JVM会把基本类型变量存储在栈内存中,比如inta=1,但是我很困惑的是,基本类型变量也有句柄和值本身,句柄肯定在栈内存中,那么值本身呢?JVM加载类的时候,会... 通常都认为JVM会把基本类型变量存储在栈内存中,比如int a=1,但是我很困惑的是,基本类型变量也有句柄和值本身,句柄肯定在栈内存中,那么值本身呢?

JVM加载类的时候,会给每个类维护一个常量池,按理说,上面的值 1应该是存在于该类的常量池中。
是不是说栈内存中,保存的基本数据类型其实也只有一个句柄,真实的值本身还是存在于类的常量池中?就是类似于String a='abc' 的这种存储方式?
展开
 我来答
williampam2007
2012-01-28 · TA获得超过538个赞
知道小有建树答主
回答量:283
采纳率:0%
帮助的人:59.4万
展开全部
1.在Java中你可以这样理解:所有的变量,包括基本类型和引用类型,它们的变量都是存放在栈中,栈中的每个变量都包含类型、名称、值这些内容,只不过基本类型变量的值为一个具体的值,而引用类型的变量的值为对象在堆中的地址。

2.常量池的存在是为了避免某个常量值被反复实例化,似乎主要用于字符串常量。例如:声明String a = "abc",『"abc"』是一个字符串常量,在声明过程中,会首先检查常量池中有没有『“abc”』这样的对象,如果没有则进行实例化并存入常量池,然后将引用(或者说句柄、地址)赋值给a;若在声明String b = “abc”,则b引用的是常量池中已存在的对象。上述情况下判断 a==b 的值为true,因为它们引用的是同一个对象。倘若声明String a = new String("abc"); String b = new String("abc"); ,则判断 a==b 的值为false,因为分别为a和b创建了新对象。

3.对于基本类型应该不会用到常量池,因为基本类型的值就存在栈中,在Java中对基本类型变量的运算、判断以及赋值都是对值的操作,没有对地址操作,例如:int a = 1; int b = 2; a = b; 这是将b的值赋给a,而不是a引用b;

4.关于常量池的生命周期我没验证过,不好说
追问
谢谢指点。
不过我个人不同意你的观点,常量池应该不仅仅针对String,JVM会对每个加载的类都维护一个常量池表。这个问题我也想明白是怎么回事了。
int a=1;
int b=a;
这两句是不同的,前句是常量,编译器在编译成class的时候就会把它丢到常量池的描述中去,而后者是变量,编译时是无法判断的,运行时才可判断,所以会在分配给线程的栈内存中生成。
主要还是在网上找栈内存的资料都会用前者做错误例子,让人误解。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式