本帖最后由 AllenIverson 于 2015-7-24 21:07 编辑
堆内存:存放所有new出来的对象。栈内存:可以存放对这些对象的指针的引用。
常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
例如: A a=new A();
这里new出来的A对象会被存放在堆中,而 a呢,会被存放到栈里,并且保存了对A这个对象引用的地址。
至于字符串池,是用来存放一些字符和栈和堆的关系,当我们创建一个字符串时,java会先在字符串池里寻找有没有你要创建的字符串。
例如: String a="你好";
先寻找字符串池里有没有 "你好" 这个字符串,如果存在,就不会在堆中再创建.
如果不存在,就会在堆中创建 "你好" 这个字符串 并在栈中生成 a保存对其的地址引用 然后还会将新创建的字符串"你好" 保存到字符串池中.
|