【Java基礎】String StringBuffer StringBuilder。本站提示廣大學習愛好者:(【Java基礎】String StringBuffer StringBuilder)文章只能為提供參考,不一定能成為您想要的結果。以下是【Java基礎】String StringBuffer StringBuilder正文
String是不可變的
我們都知道String不是基本數據類型,而是一個對象,並且是final類型的,不可變的。(public final class String)
查看以下代碼:
String text = "a"; text = "b";
String不是不可變的麼?為什麼可以這樣用?因為text是字符串"a"的引用,即引用是可以變化的,跟對象實例的屬性變化沒有關系。(這裡創建的是兩個String對象)
String設計成不可變的原因
字符串常量池是Java方法區中一個特殊的存儲區域,當創建一個String對象時,假如這個字符串已經在常量池中了,就不會創建一個新的對象,而是引用已經存在的對象。++常量池指的是在編譯期被確定,並保存在已編譯的.class文件中的一些數據。它包括了關於類,方法,接口中的常量,也包括字符串常量++
String text1 = "abc"; String text2 = "abc";
上面的代碼只會在堆內存中創建一個實際的String對象。如果字符串對象允許改變的話,那麼會導致各種邏輯錯誤,比如改變一個對象會影響到另一個獨立對象。
棧(stack):主要保存基本數據類型和對象的引用,數據可以共享,速度僅次於寄存器(register),快於堆
堆(heap):用於存儲對象
安全性,因為字符串是不可變的,所以是線程安全的,同一個字符串實例可以被多個線程共享。這樣便不用因為線程安全問題而使用同步。字符串本身就是線程安全的。
StringBuffer,StringBuilder
StringBuffer
StringBuffer和String一樣都是用來存儲字符串的,只不過他們內部的實現方式不一樣,導致他們所使用的范圍不同,對於StringBuffer,它在處理字符串的時候,如果是進行修改操作,並不會產生一個新的字符串對象。
StringBuffer的許多方法和String差不多,只不過修改時StringBuffer是修改自身的,而String類則是產生一個新的對象,這是他們最大的區別。
同時,StringBuffer是不能通過=來進行初始化的,它必須通過構造方法來進行初始化。
StringBuilder
StringBuilder和StringBuffer的不同之處在於StringBuilder是線程不安全的,StringBuffer是線程安全的。
String,StringBuffer,StringBuilder區別
常見面試題
如何比較兩個字符串?使用“==”還是equals()方法?
String s=new String("abc")創建了幾個對象?
public String(String original) { this.value = original.value; this.hash = original.hash; }
上面是String的構造方法,我們在使用new調用了String的構造方法創建了一個對象,並將它的引用賦值給了str變量。
同時我們注意到,被調用的構造器方法接受的參數也是一個String對象,這個對象正是“abc”,由此我們又要引入另外一種創建String對象的方法的討論 -- 引號內包含文本
String字符串與BufferString的傳遞問題
基本數據類型的值傳遞,不改變其值;引用數據類型的值傳遞,改變其值
String類雖然是引用數據類型,但是他當作參數傳遞時和基本數據類型是一樣的
public static void changeString(String str) { // 因為str是屬於局部變量,在調用該方法時實際參數s和形式參數str指向同一個字符串對象 // 但是在方法內部將str又指向了一個新的字符串對象,而此時s還是指向原來的字符串對象 // changeString方法執行完畢,局部變量str消失,方法內部產生的新的字符串對象稱為垃圾 // 但是s還是指向原有的字符串對象,並沒有改變 str += "test"; }
String.intern()
Java中常見的面試題