久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

JAVA創(chuàng)建String對象的問題

 jp乞巧樓 2015-10-26

最近在論壇上看到關(guān)于String s = new String("XYZ") + new String("XYZ");到底創(chuàng)建幾個(gè)對象的討論,覺得比較有意思,,在此總結(jié)一下,。

 

在JAVA中除了8種基本類型之外,其他的都是類對象及其引用,。所以 "XYZ"在JAVA中是一個(gè)String對象,,對于String類對象來說它的對象值是不能修改的,也就是具有不變性,。

 

但是在下面一段程序中:

 

  1. public class TestString {  
  2.     public static void main(String args[]) {  
  3.         String s = "Hello";  
  4.         s = "Java";  
  5.         String s1 = "Java";  
  6.         String s2 = new String("Java");  
  7.         System.out.println(s);  
  8.         System.out.println(s == s1);  
  9.         System.out.println(s == s2);  
  10.     }  
  11. }  
  12. /*output: 
  13.  *Java 
  14.  *true 
  15.  *false 
  16.  */  

 

打印出s的結(jié)果是"Java",,看起來s所引用的String變量好像是被修改了,但是如果你了解JVM(Java虛擬機(jī))處理String變量時(shí)的機(jī)制,,你就會知道事實(shí)并非如此,。

 

在JVM的工作過程中,會創(chuàng)建一片的內(nèi)存空間專門存入String對象,,我們把這片內(nèi)存空間叫做String池,。

對于語句String s= "Hello";,當(dāng)JVM看到"Hello"時(shí),,會在String池創(chuàng)建String對象存儲它,,并將它的引用返回給String變量s。

語句s = "Java";,當(dāng)JVM看到"Java"時(shí),,會在String池創(chuàng)建新的String對象存儲它,,再把新建的String對象的引用返回給String變量s。而原先的String對象"Hello"仍然在String池內(nèi),,并沒有消失,,它是不能被修改的。

所以我們僅僅是改變了變量s的引用,,而沒有改變它所引用的對象,,因?yàn)镾tring對象的值是不能被修改的。

 

String s1 = "Java";,,JVM首先在String池里面看能否找到字符串"Java",,如果找到則返回它的引用給s1,否則創(chuàng)建新的String對象,,放到String池里,。這里由于有s = "Java",所以對象已經(jīng)被引用,,所以依據(jù)規(guī)則s和s1都是引用同一個(gè)對象,。所以s==s1返回true。(注: 比較運(yùn)算符==,,對于非基本類型,,是比較兩引用是否引用內(nèi)存中的同一個(gè)對象)。

String s2 = new String( "Java");,,JVM首先還是在String池里面看能否找到字符串 "Java",,如果找到,不做任何事情,;否則創(chuàng)建新的String對象,,放到String池里面。由于遇到了new關(guān)鍵字,,還會在內(nèi)存上(不是String池里面)創(chuàng)建String對象存儲 "Java",,并將內(nèi)存上的(不是String池里面的)String對象返回給s2。所以s==s2將返回false,,因?yàn)樗鼈円玫牟皇峭粋€(gè)對象,。

 

所以對于語句String s = new String("XYZ") + new String("XYZ");

JVM先在String池中創(chuàng)建一個(gè)String對象存儲"XYZ",然后由于遇到new關(guān)鍵字,,再在內(nèi)存上創(chuàng)建一個(gè)String對象存儲"XYZ",;

接著由于String池中已經(jīng)有了"XYZ"的對象,所以第二個(gè)new語句不會在String池中創(chuàng)建對象,,而只會在內(nèi)存上創(chuàng)建一個(gè)String對象,;

最后兩個(gè)字符串相加會在String池中創(chuàng)建一個(gè)String對象"XYZXYZ",,并將其引用傳給s。

所以總共會創(chuàng)建4個(gè)String對象,。

 

<結(jié)束>

 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多