"hello"和new String("hello")的區別?

/**
    "hello"和new String("hello");的區別?
     
    當java直接使用形如"hello"的字符串直接量(包括可以再編譯時
    就能計算出來的字符串值)JVM將會使用常量常量池來管理字符串;
    當使用new String("hello"); JVM先會使用常量池來管理“hello”
    直接量,在調用String類的構造器來創建一個新的String對象,新
    創建String對象會保存在堆內存中。
     
    補習:什麼是常量池?
     
    常量池在java用於保存在編譯期已確定的,已編譯的class文件中的
    一份數據。
     
    常量池中除了包含代碼中所定義的各種基本類型(如int、long等等)
    和對象型(如String及數組)的常量值外,還包含一些以文本形式出
    現的符號引用。
     
    自己理解:一塊專門存放常量的內存區域。
     
    這個博客解釋的有點深度:http://yiliner.iteye.com/blog/207723
    百科:http://baike.baidu.com/view/8680346.htm?fr=aladdin
     
    堆內存:堆允許程序在運行時動態地申請某個大小的內存空間
    百科:http://baike.baidu.com/view/1962829.htm?fr=aladdin
*/
public class StringTest
{
    public static void main(String[] args)
    {
        String str1 = "美好未來";
        String str2 = "美好";
        String str3 = "未來";
         
        //str4直接引用常量池中的“美好未來”
        String str4 = "美好"+"未來";
        //str5直接引用常量池中的“美好未來”
        String str5 = "美"+"好"+"未"+"來";
        //在編譯時期不能確定下來,不能引用
        //常量池中的內存字符串 
        String str6 = str2+str3;
        // str7中引用堆內存中新建的String對象
        String str7 = new String("美好未來");
        // true
        System.out.println(str1 == str4);
        // true
        System.out.println(str1 == str5);
        // false
        System.out.println(str1 == str6);
        // false
        System.out.println(str1 == str7);
        // 返回字符串對象的規範化表示形式。
        // System.out.println(str1.intern());
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章