java基礎–特殊的String

來源:互聯網
上載者:User

  有個問題,在網上十分常見,就是這樣一段代碼

  

1 String str=new String("a");  

有人往往會問:他建立了幾個對象?我想答案是眾所周知的2個。這個問題也從一個側面說出了String的一些不同。

    我們接著說建立String對象的另-中方式:

    

String str="aaa"

顯然,這種方式他建立了一個對象。這種方式是String特有的(確實我們在java中好像沒有看到過也從來沒有過其他對象這樣的方式建立)。其實java中這樣設定String,應該是讓他和內建的基本類型定義時一致。

  然後我們再來看看這樣一段代碼:

String str1="hya";   
String str2="hya";  

他建立的對象還是一個,以前初學時我就感到疑惑。為什麼會是一個呢?

   其實java裡有一個字串池的概念。確切地應該說是jvm中存在著一個字串池,其中儲存著很多String對象,並且可以被共用使用,因此它提高了效率。由於String類是final的,它的值一經建立就不可改變,因此我們不用擔心String對象共用而帶來程式的混亂。字串池由String類維護,我們可以調用intern()方法來訪問字串池。 (來自javaeye的定義)

   當我們遇到String str1=“hya”的語句時,Java會先在字串池中尋找是否已經存在"hya"這個字串,如果沒有,則建立字串"hya"對象,然後變數 str1指向這個地址;然後遇到語句String str2=“hya”這時字串池中已經有 "hya"了,所以直接讓變數str2也指向這個地址。

    我們再來看看String str=new String("a");這個語句如何處理的呢?"a"是字串池中的一個對象,然後new String()是建立一個對象,並將控制代碼賦值給str,這與其他的對象建立沒有什麼不同。

  以讓的知識介紹完後,我們再來看看這個問題(考試哦!)

 

String str=new String("a");
String s=new String("a");

他建立了幾個對象?如果明白了上面的知識的話,這個答案是不容置疑的!!!

    然後我們再來看看,實際編程中遇到的==和equqls的區別,這裡主要針對String而言的。

    看如下代碼:

String a = "Hello";
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));  

 

輸出結果是

true
false
false
true
true
true

呵呵,看出什麼了嗎?首先我們來說明一下在java中==和equqls的區別:

    ==:對於基本類型來說是則是判斷它們的值是否相等;對於兩個對象則是判斷它們的引用是否指向同一個對象;

    equqls:是一個方法,針對基本類型的外覆蓋類和String而言它是判斷值是否相等;而對於普通的對象,他們的預設的實現和==並沒有區別。

  所以對於上面的一段代碼,不管他們是不是同一個對象,他們的值都是Hello,所以用equqls方法,返回的值都是true。

  

  由於java中String的用處十分的廣,所以初於使用和效能上的考慮,對他作了一些特殊處理。最後我們再來說說String對象在JVM中的儲存,以及字串池與heap和stacK的關係。java中的資料主要儲存在heap和stacK這兩個資料結構中其中:棧(stack):主要儲存基本類型(或者叫內建類型)(char、byte、short、int、long、float、double、boolean)和對象的引用,資料可以共用,速度僅次於寄存器(register),快於堆。 堆(heap):用於儲存物件。

我們查看String類的源碼就會發現,它有一個value屬性,儲存著String對象的值,類型是char[],這也正說明了字串就是字元的序列。
當執行String a="hya";時,JVM會在棧中建立三個char型的值'h'、'y'和'a',然後在堆中建立一個String對象,它的值(value)是剛才在棧中建立的三個char型值組成的數組{'h','y','a'},最後這個新建立的String對象會被添加到字串池中。如果我們接著執行String b=new String("hya");代碼,由於"hya"已經被建立並儲存於字串池中,因此JVM只會在堆中新建立一個String對象,但是它的值(value)是共用前一行代碼執行時在棧中建立的三個char型值值'a'、'b'和'c'。 

  ps:以上屬於個人理解,如有錯誤,還請指正!謝謝!  

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.