关于Java中内存结构

来源:互联网 发布:windows loader v3.27 编辑:程序博客网 时间:2024/05/02 04:25

栈:对象引用以及一些基本类型变量数据(用完自动释放所占用的内存)

对象以及数组(当没有引用指向它时,由垃圾回收机制回收,不一定立即被回收),存在栈中的数据可以共享(多个引用可以同时独立的指向一个数据)

常量池:常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用

String str = new String("abc");  (str是指向new String("abc"))   
String str = "abc";    (str是指向"abc")

String str = new String("abc"); (分配了三个内存空间:为引用str分配内存空间保存在栈中,为new String("abc")分配内存空间保存在堆中,为"abc"分配内存空间保存我也不知道) 
String str = "abc";   两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池 ,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
 

我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。


String a = "ab";   
String bb = "b";   
String b = "a" + bb;   
System.out.println((a == b)); //result = false 
分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。(a和b指向的地址不一样)





0 0
原创粉丝点击