转载出:http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)
和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
堆(heap):用于存储对象
1、在声明一个变量时,是不会有对象,仅仅只是声明了一个引用,并且只是在栈内创建了一个引用变量。如:String str;
2、String str = "aba";
有一个对象,”aba”是存放在堆中的对象,str是在栈中对象的引用。
3、String str = "aba" + "cd";
有三个对象,分别是”aba”,”cd”,”abacd”三个堆对象。
由于JVM存在一个字符串常量池,其中保存了很对String类型的对象,并且可以共享,因此提高了运行效率;因为常量池内的String类型对象是final型的,所以不用担心因为共享而导致程序混乱。我们可以通过调用JVM的intern()方法来访问字符常量池。
在创建str时,首先查看是否已经存在aba、cd常量,如果存在,则直接调用,在组合创建abacd,同样,首先判断是否存在该对象,
4、String str = new String("abc");
有两个对象,
public String(String original) { //other code … } 大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:
一、使用new创建对象。
二、调用Class类的newInstance方法,利用反射机制创建对象。
我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是”abc”。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。