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

搞不清楚,真真真
在java中,String a="123";  String b=new String("123");为什么他们所引用的地址不同呢?请用堆和栈来解释。

------解决方案--------------------
a是栈内变量,它的内存保存的是常量池的常量字符串对象对象"123"的地址
b是栈内变量,它的内存保存的是堆中的new String对象的地址,new String在堆中生成对象,并用常量池的字符串对象"123"初始化堆中的对象,所以堆中的对象的内存的内容和常量池对象的内存的内容一样,但是是不同的两个对象
------解决方案--------------------
首先要分清楚java的内存机制了,总共分为三种,也即堆、栈、方法区。
堆:连续的内存空间,用于存放new出来的东西
栈:不连续的内存空间,用于存放局部变量。
方法去:存放成员变量、类代码、静态语句块。
a变量表示的在栈区,b变量存放在堆区。不知道你理解了没?
------解决方案--------------------
附加题:

从内存的角度,堆和栈有什么不同呢?为什么要如此区分?