数据的存储:
内存的分配有六个地方:
1.
寄存器,期存器是最快的保存区域,因为它位于和其他所有保存方式不同的地方:
处理器内部,然而寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们没有直接的控制权,所以
程序里面没有任何变量是存储在寄存器中的。
2.
堆栈(堆)。Java的堆是一个运行时数据区,类的对象从中分配空间,这些对象通过new,newArray等指令建立,堆是由垃圾回收来负责的,
堆的优势是可以动态地分配内存大小,Java的垃圾收集器会自动地收走这些不再使用的数据,
缺点是由于要在运行时动态分配内存,存取速度比较慢。
String str = new String("abc");由于str是通过new方式创建出来的,每调用一次new方法就会在堆里面创建一个新的对象。
那么str就会放在堆内存里面
3.
栈。栈和堆都是Java用来在ram中存放数据的地方,程序员不能直接地设置栈或堆
栈的优势是存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生命周期必须是确定的,缺乏灵活性。
栈中主要存放一些基本类型的变量(int ,short,long ,byte,float,double,boolean,char )和对象句柄(String s ;s就是对象句柄)。
String str = "abc";这样获取到的str存放在栈中
由于这种方式获取到的str是现在栈中创建一个队String类的对象引用变量(句柄)str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并将str指向"abc",如果已经有,则直接将str指向"abc".
例子:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
因为str1和str2都指向栈内存中的"abc"的,所以下面的输出语句为true因为str1和str2都指向栈内存中的"abc"的,所以下面的输出语句为true
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
由于str1和str2都是new出来的对象,两个是堆内存里面不同的两个对象,所以输出为false
4.
静态存储。
静态static是指“位于固定位置”(也在ram中),程序运行期间,静态存储的数据将随时等候调用,可用static关键字只处一个对象的特定元素是静态的,Java对象本身永远都不会置入静态存储空间。
5.
常数存储
6.
非RAM存储。