java中string内存的相关知识点

(一):区别java内存中堆和栈:

1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中; 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
2.堆:存放用new产生的数据,其中清理垃圾采用垃圾回收机制。 在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。  数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
 
3.相关代码:
package zdbString;                                                                           

public class Test {                                                                         
    /*                                                                                       
     * 这个源文件主要是测试java中string的内存原理、运算符“==”和函数equals()的区别                                     
     * 总结:(1)引用str1被放在栈中,字符串常量hello放在常量池中,引用str1指向常量池中的hello;而引用str3被存放在栈中,同时在堆中开辟一块新的内存存放string对象。(2)
      
                                                                            
     * 相关连接网址:http://jingyan.baidu.com/article/8275fc869a070346a03cf6f4.html                 
     */                                                                                     

    public static void main(String[] args) {                                                 

        String str1 = "hello";                                                               
        String str2 = "hello";                                                               

        String str3 = new String("hello");                                                   
        String str4 = new String("hello");                                                   

        System.out.println("str1==str2==="+(str1==str2));//true                             
        System.out.println("str1.equals(str2)==="+(str1.equals(str2)));//true               
        System.out.println("str3==str4==="+(str3==str4));//false                             
        System.out.println("str3.equals(str4)==="+(str3.equals(str4)));//true               
        System.out.println("str1==str3==="+(str1==str3));//false                             
        System.out.println("str1.equals(str3)==="+(str1.equals(str3)));//true               
    }                                                                                       

}                                                                                           
View Code

 4.相关内存图:

 
posted @ 2016-11-26 14:55  美国大兵  阅读(244)  评论(0编辑  收藏  举报