String、StringBuffer與StringBuilder之間區別 以及String 直接賦值和new後賦值區別
這裡是引用他人程式碼:
最近學習到StringBuffer,心中有好些疑問,搜尋了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。
關於這三個類在字串處理中的位置不言而喻,那麼他們到底有什麼優缺點,到底什麼時候該用誰呢?下面我們從以下幾點說明一下
1.三者在執行速度方面的比較:StringBuilder > StringBuffer > String
2.String <(StringBuffer,StringBuilder)的原因
String:字串常量
StringBuffer:字元創變數
StringBuilder:字元創變數
從上面的名字可以看到,String是“字元創常量”,也就是不可改變的物件。對於這句話的理解你可能會產生這樣一個疑問 ,比如這段程式碼:
1 String s ="abcd";2 s = s+1;
3 System.out.print(s);// result : abcd1
我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段程式碼的:首先建立物件s,賦予一個abcd,然後再建立一個新的物件s用來 執行第二行程式碼,也就是說我們之前物件s並沒有變化,所以我們說String型別是不可改變的物件了,由於這種機制,每當用String操作字串時,實際上是在不斷的建立新的物件,而原來的物件就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。
而StringBuffer與StringBuilder就不一樣了,他們是字串變數,是可改變的物件,每當我們用它們對字串做操作時,實際上是在一個物件上操作的,這樣就不會像String一樣建立一些而外的物件進行操作了,當然速度就快了。
3.一個特殊的例子:
1 String str = “This is only a” + “ simple” + “ test”;3 StringBuffer builder =new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 你會很驚訝的發現,生成
String str = “This is only a” + “ simple” + “test”;
其實就是:
String str = “This is only a simple test”;
所以不需要太多的時間了。但大家這裡要注意的是,如果你的字串是來自另外的String物件的話,速度就沒那麼快了,譬如:
String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;
這時候JVM會規規矩矩的按照原來的方式去做。
4.StringBuilder與 StringBuffer
StringBuilder:執行緒非安全的
StringBuffer:執行緒安全的
當我們在字串緩衝去被多個執行緒使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單執行緒下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
對於三者使用的總結: 1.如果要操作少量的資料用 = String
2.單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder
3.多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer
String str1="ABC"; 和String str2 = new String("ABC"); 有什麼區別。
String str1="ABC" 可能建立一個物件或者不建立物件,如果"ABC"這個字串在java String池裡不存在,會在java String池建立這個一個String物件("ABC").如果已經存在,str1直接reference to 這個String池裡的物件。
String str2 = new String("ABC") 至少建立一個物件,也可能兩個。因為用到new 關鍵字,會在heap建立一個 str2 的String 物件,它的value 是 "ABC".同時,如果"ABC"這個字串在java String池裡不存在,會在java String池建立這個一個String物件("ABC").
String 有一個intern() 方法,native,用來檢測在String pool是否已經有這個String存在。
考慮下面的問題:
String str1 = new String("ABC");
String str2 = new String("ABC");
str1 == str2 的值是True 還是False呢? False.
String str3 = "ABC";
String str4 = "ABC";
String str5 = "A" + "BC";
str3 == str4 的值是True 還是False呢? True.
str3 == str5 的值是True 還是False呢? True.
在寫程式碼的時候,一般不要 String str2 = new String("ABC");
String a = "ABC";
String b="AB";
String c=b+"C";
System.out.println(a==c); false
a和b都是字串常量所以在編譯期就被確定了!
而c中有個b是引用不是字串常量所以不會在編譯期確定。
而String是final的!所以在b+"c"的時候實際上是新建立了一個物件,然後在把新建立物件的引用傳給c.
相關推薦
String、StringBuffer與StringBuilder之間區別 以及String 直接賦值和new後賦值區別
這裡是引用他人程式碼: 最近學習到StringBuffer,心中有好些疑問,搜尋了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。 關於這三個類在字串處理中的位置不言而喻,那麼他們到底有什麼優缺點,到底什麼時候該用誰呢
String、StringBuffer與StringBuilder之間區別 .RP
什麽 方式 tr1 abcd 為什麽 mes strong 速度 一點 最近學習到StringBuffer,心中有好些疑問,搜索了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。 關於這三個類在字符串處理中的位置不言而喻,
String、StringBuffer與StringBuilder之間區別
安全 .com 學習 ron img build tro ges 變量 大家在最初結束String字符串的時候,都會被教做認為String是不可變的字符串常量,是不可改變的常量。但是我們看下面的一個列子: 為什麽會發生這種情況呢?難道最開始我們學習的就是錯誤的?
自己(轉)String、StringBuffer與StringBuilder之間區別
理解 疑問 多線程 blog gpo string類 body 對象 就是 最近學習到StringBuffer,心中有好些疑問,搜索了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。 關於這三個類在字符串處理中的位置不言
String、StringBuffer與StringBuilder之間區別?
這三個類之間的區別主要是在兩個方面,即 執行速度 和 執行緒安全 這兩方面。 1. 首先說執行速度,或者說是執行速度, 在這方面執行速度快慢為:StringBuilder > StringBuffer > String String最慢的原
String、StringBuffer與StringBuilder之間區別(轉)
ons 字符 總結 當前 命令 其它 有一個 system 機制 原文地址https://www.cnblogs.com/goody9807/p/6516374.html String 字符串常量StringBuffer 字符串變量(線程安全)StringBuilder
String、StringBuffer與StringBuilder三者的區別
不可變 abcd ges 區別 ++ 源碼 重新 strong blog 簡單的說: String:創建的是字符串常量,創建的字符串會放入內存的常量池中,是不可變的對象。如果要對String類型的內容進行改變,實際上每次改變都會重新new一個String類型的字符串對象,指
String、StringBuffer與StringBuilder的區別
string 單線程 public pan color 緩沖 ron 很多 bsp String 字符串常量StringBuffer 字符串變量(線程安全)StringBuilder 字符串變量(非線程安全) 首先三者主要輸在運行速度和線程安全這兩位方面。
String、StringBuffer與StringBuilder的區別及應用場景
1 String、StringBuffer與StringBuilder區別 (1)區別 String內容不可變,StringBuffer和StringBuilder內容可變; StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執
String、StringBuffer與StringBuilder區別
(1)區別String內容不可變,StringBuffer和StringBuilder內容可變;StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執行緒使用);如果程式不是多執行緒的,那麼使用StringBuilder
String、StringBuffer與StringBuilder
變量 string對象 之間 imp 欺騙 就會 產生 類型 疑問 String、StringBuffer與StringBuilder之間區別 最近學習到StringBuffer,心中有好些疑問,搜索了一些關於String,StringBuffer,StringBu
基礎 | String、StringBuffer與StringBuilder
String類作為Java中的常用類,是各大公司面試時非常喜歡問到的地方,主要是String類夠基礎,但基礎中又會延伸出很多相關技術點,比如final關鍵字、Java記憶體分配、Java虛擬機器、執行緒安全等。 今天就主要分析一下 「String、StringBuffer和St
【Java基礎】String,StringBuffer,StringBuilder之間的區別
對於這三個類,先總體來理解一下: 對String,你建立了一個String,你能通過set方法改變它的長度length嗎?顯然是不行的! 但 StringBuffer 可以! String 字串常量 StringBuffer 字串變數(執行緒安全) StringBu
常用API(一)——String、StringBuffer與基本型別包裝類
String 關於String這個特殊類,我到現在都還沒搞明白,我覺得可能主要是由於沒有搞懂JVM的記憶體結構引起的,但還是對其進行以下記錄。 字串是一個特殊的物件。 字串一旦初始化就不可以被改變。 String str = "abcd"; 以上這句
Java StringBuilder詳解以及與String、StringBuffer區別
StringBuilder 就像我們在Java入門教材中寫的,在介紹String的時候寫的是“字串常量”,String實際上就是一個不可變的物件。每次使用String實際上是建立了一個不可變的物件,而改變這個String的值實際上是對這
String、StringBuffer、StringBuilder的關係與區別
String: String物件一旦建立就不能改變,如果通過"+"做連線,是從新開闢了空間來存新的字串,並把新字串的引用賦值給了變數,如果需要進行大量的字串修改操作,應該使用StringBuffer/StringBuilder/字元陣列,最終結果都可以轉換成String物件。 StringB
String、StringBuffer、與StringBuilder的區別
相信大家都知道StringBuffer、StringBuilder,但是這兩個的用法都差不多,到底有什麼區別呢,這也是面試的時候問的比較多的一道題,這裡我就來說說,這兩個的區別結合String來說~ String:檢視原始碼得知,String類的宣告是:public final,所以可以
String、StringBuffer、StringBuilder之間的區別
①執行/執行速度: StringBuilder > StringBuffer > String String StringBuffer StringBuilder 執行速度
面試題:String、StringBuffer、StringBuilder的區別與聯絡
上訴三個都屬於常見物件(API):具體的使用方法此處不再詳細列舉 String類: 字串:就是由多個字元組成的一串資料,也可以看成是一個字元陣列,通過檢視API可知: (1)字串字面值(如:“abc”)可以看成是一個字串物件; (2)字串是常量,一旦被賦值就不能被改變
String、Stringbuffer、Stringbuilder三者之間的區別
1.首先說執行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物