日期:2014-05-20  浏览次数:20720 次

关于int的值是存在栈中还是方法区域中?
今天看了下堆栈和常量池的概念发现无法确定int的值到底是放在栈中还是方法区域中1和2冲不冲突?:
(难道是根据是否编译期就可确定来区分么?)
1、
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: 
int a = 3; 
int b = 3; 
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。 
2、
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: 类和接口的全限定名; 字段的名称和描述符; 方法和名称和描述符。 虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。 
在程序执行的时候,常量池会储存在Method Area,而不是堆中

------解决方案--------------------
研究它有意义么?
------解决方案--------------------
是的,就是根据编译期能否确定值来选择的。

int a = 3,就会存常量池。
int a = 0 + 3,就会存到运行栈里。
------解决方案--------------------
引用:
Quote: 引用:

String是一个很特殊的类,它不是基本类型,但是它有自己的常量池。你在A类中有一行代码:
String a = "abc";
这个abc字符串会先去String.class的常量池里找,如果以前没用过,常量池里是没有的,他会在常量池里创建一个,然后把a指向String.class的常量池里创建的那个字符串,如果已经有了就直接指向。


我想确认一下:int i=4;
              private final j=5;
这两个值都会保存在常量池中么?还是所谓的常量池只保存数值4和5?


j的类型是什么,int么?基本类型,只要编译期能确定的,都会放到常量池。