JAVA中数据存储

java存储机制:

1. 寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制. 
2. 栈:
  物理位置:随机存储器(Random Access Memory)
  优点:存取速度比堆要快,仅次于直接位于CPU中的寄存器,且栈数据可以共享。
  缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
  存放数据:存放基本类型的变量数据引用和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
  内存释放:栈上变量的生存时间受限于当前函数的生存时间,函数退出了,变量就不存在了。
3. 堆:;
  物理位置:随机存储器(Random Access Memory)
  优点:可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
  缺点:由于要在运行时动态分配内存,存取速度较慢。
  存放数据:所有new出来的对象。
  内存释放:在堆中分配的对象实例,当不再有任何一个引用变量指向它时,这个对象就可以被垃圾回收机制回收了。
4. 静态域:存放静态成员(static定义的) 5. 常量池:存放字符串常量和基本类型常量(public static final)。 6. 非RAM存储:硬盘等永久存储空间

辨别混淆:

String str1 = "abc";
String str2 = "abc";
String str3 = "javablog";
String str4 = "java" + "blog"; //在编译时被优化成String str4= "javablog";
System.out.println(str1 == str2); //true
System.out.println(str3
== str4); //true
原因:常量数据存放在常量池中,如果已经存在则直接将变量引用指向该地址即可。
  基本类型常量都如此,先查看是否存在,不存在再创建
String str3 = new String("abc");
String str4 = new String("abc");
String str5 = str3;
System.out.println(str3 == str4); //false
System.out.println(str5 == str43);//true
原因:通过new创建的对象都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
String s1 = "java"; 
String s2 = new String("java"); 
System.out.println(s1.intern() == s2.intern()); //true
当一个String实例str调用intern()方法时,
Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,
如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用

 

posted @ 2014-12-07 15:46  W&L  阅读(791)  评论(0)    收藏  举报