学了几天的 Java,觉得有必要把这个问题搞清楚。
引用自:http://www.douban.com/note/199184450/
栈内存:
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 栈内存主要存放的是基本类型类型的数据 如、( int, short, long, byte, float, double, boolean, char) 和对象句柄。并没有有String基本类型、在栈内存的数据的大小及生存周期是必须确定的、其优点是寄存速度快、、栈数据可以共享、缺点是数据固定、不够灵活。
栈的共享:
String a = "abc";
String b = "abc";
System.out.println(a==b);
结果为true 这就说明了a b其实指向同一个值(实际上指向同一个存在于堆内存的参考地址)
注意,我们这里并不用a.equals(b);的方式,因为这将比较两个字符串的值是否相等。==号,根据JDK的说明,只有在两个引用都指向了同一个对象时才返回真值。而我们在这里要看的是,a与b是否都指向了同一个对象。
结果说明,JVM创建了两个引用a和b,但只创建了一个对象,而且两个引用都指向了这个对象。
上面这段文字中有这么一句:两个引用a和b,实际上a和b是变量,变量指向堆内存的参考地址。
总结:引用在栈,数据在堆