Java中兩種字串初始化方法的區別

來源:互聯網
上載者:User
Java中兩種字串初始化方法的區別  

      String str1 = new String("abc");     
      String str2 = "abc";   
      雖然兩個語句都是返回一個String對象的引用,但是jvm對兩者的處理方式是不一樣的。對於第一種,jvm會馬上在heap(堆)中建立一個String對象,然後將該對象的引用返回給使用者。對於第二種,jvm首先會在內部維護的strings pool中通過String的 equels 方法尋找是對象池中是否存放有該String對象,如果有,則返回已有的String對象給使用者,而不會在heap中重新建立一個新的String對象;如果對象池中沒有該String對象,jvm則在heap中建立新的String對象,將其引用返回給使用者,同時將該引用添加至strings
pool中。
    注意:使用第一種方法建立對象時,jvm是不會主動把該對象放到strings pool裡面的,除非程式調用 String的intern方法。看下面的例子:
    String str1 = new String("abc"); //jvm 在堆上建立一個String對象         
    String str2 = “abc”;    //jvm 在strings pool中找不到值為“abc”的字串,
    因此 在堆上建立一個String對象,並將該對象的引用加入至strings pool中 此時堆上有兩個String對象  
   if(str1 == str2){    
         System.out.println("str1 == str2");    
   }else{    
         System.out.println("str1 != str2");    
   }    
  //列印結果是 str1 != str2,因為它們是堆上兩個不同的對象    
  String str3 = "abc";    
   //此時,jvm發現strings pool中已有“abc”對象了,因為“abc”equels “abc”    
   //因此直接返回str2指向的對象給str3,也就是說str2和str3是指向同一個對象的引用    
  if(str2 == str3){    
         System.out.println("str2 == str3");    
  }else{    
         System.out.println("str2 != str3");    
  }    
   //列印結果為 str2 == str3  
   建立一個引用時,我們希望它同一個新對象建立串連。通常用new關鍵字達到這一目的。new的意思是:“把我變成這些對象的一種新類型”。所以在上面的例子中,可以說:
    String s = new String("asdf");
    它不僅指出“將我變成一個新字串”,也通過提供一個初始字串,指出了“如何產生這個新字串”。
    當然,字串(String)並非我們能使用的唯一一種類型。儘管Java配套提供了數量眾多的現成類型,但對我們來講,最重要的就是記住自己能建立新類型。事實上,這應是Java程式設計的一項基本操作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.