今天看了下堆栈和常量池的概念发现无法确定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,就会存到运行栈里。
------解决方案--------------------
j的类型是什么,int么?基本类型,只要编译期能确定的,都会放到常量池。