1. 程式人生 > >String、StringBuffer與StringBuilder之間區別 以及String 直接賦值和new後賦值區別

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+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”);

    你會很驚訝的發現,生成

str物件的速度簡直太快了,而這個時候StringBuffer居然速度上根本一點都不佔優勢。其實這是JVM的一個把戲,實際上:

    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.


相關推薦

StringStringBufferStringBuilder之間區別 以及String 直接new區別

   這裡是引用他人程式碼: 最近學習到StringBuffer,心中有好些疑問,搜尋了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。 關於這三個類在字串處理中的位置不言而喻,那麼他們到底有什麼優缺點,到底什麼時候該用誰呢

StringStringBufferStringBuilder之間區別 .RP

什麽 方式 tr1 abcd 為什麽 mes strong 速度 一點   最近學習到StringBuffer,心中有好些疑問,搜索了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。 關於這三個類在字符串處理中的位置不言而喻,

StringStringBufferStringBuilder之間區別

安全 .com 學習 ron img build tro ges 變量   大家在最初結束String字符串的時候,都會被教做認為String是不可變的字符串常量,是不可改變的常量。但是我們看下面的一個列子:   為什麽會發生這種情況呢?難道最開始我們學習的就是錯誤的?

自己(轉)StringStringBufferStringBuilder之間區別

理解 疑問 多線程 blog gpo string類 body 對象 就是   最近學習到StringBuffer,心中有好些疑問,搜索了一些關於String,StringBuffer,StringBuilder的東西,現在整理一下。 關於這三個類在字符串處理中的位置不言

StringStringBufferStringBuilder之間區別

這三個類之間的區別主要是在兩個方面,即 執行速度 和 執行緒安全 這兩方面。 1. 首先說執行速度,或者說是執行速度, 在這方面執行速度快慢為:StringBuilder > StringBuffer > String String最慢的原

StringStringBufferStringBuilder之間區別(轉)

ons 字符 總結 當前 命令 其它 有一個 system 機制 原文地址https://www.cnblogs.com/goody9807/p/6516374.html String 字符串常量StringBuffer 字符串變量(線程安全)StringBuilder

StringStringBufferStringBuilder三者的區別

不可變 abcd ges 區別 ++ 源碼 重新 strong blog 簡單的說: String:創建的是字符串常量,創建的字符串會放入內存的常量池中,是不可變的對象。如果要對String類型的內容進行改變,實際上每次改變都會重新new一個String類型的字符串對象,指

StringStringBufferStringBuilder區別

string 單線程 public pan color 緩沖 ron 很多 bsp String 字符串常量StringBuffer 字符串變量(線程安全)StringBuilder 字符串變量(非線程安全) 首先三者主要輸在運行速度和線程安全這兩位方面。

StringStringBufferStringBuilder區別及應用場景

1 String、StringBuffer與StringBuilder區別 (1)區別 String內容不可變,StringBuffer和StringBuilder內容可變; StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執

StringStringBufferStringBuilder區別

(1)區別String內容不可變,StringBuffer和StringBuilder內容可變;StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執行緒使用);如果程式不是多執行緒的,那麼使用StringBuilder

StringStringBufferStringBuilder

變量 string對象 之間 imp 欺騙 就會 產生 類型 疑問 String、StringBuffer與StringBuilder之間區別   最近學習到StringBuffer,心中有好些疑問,搜索了一些關於String,StringBuffer,StringBu

基礎 | StringStringBufferStringBuilder

String類作為Java中的常用類,是各大公司面試時非常喜歡問到的地方,主要是String類夠基礎,但基礎中又會延伸出很多相關技術點,比如final關鍵字、Java記憶體分配、Java虛擬機器、執行緒安全等。 今天就主要分析一下 「String、StringBuffer和St

【Java基礎】StringStringBufferStringBuilder之間區別

對於這三個類,先總體來理解一下: 對String,你建立了一個String,你能通過set方法改變它的長度length嗎?顯然是不行的! 但 StringBuffer 可以! String 字串常量 StringBuffer 字串變數(執行緒安全) StringBu

常用API(一)——StringStringBuffer基本型別包裝類

String 關於String這個特殊類,我到現在都還沒搞明白,我覺得可能主要是由於沒有搞懂JVM的記憶體結構引起的,但還是對其進行以下記錄。 字串是一個特殊的物件。 字串一旦初始化就不可以被改變。 String str = "abcd"; 以上這句

Java StringBuilder詳解以及StringStringBuffer區別

StringBuilder         就像我們在Java入門教材中寫的,在介紹String的時候寫的是“字串常量”,String實際上就是一個不可變的物件。每次使用String實際上是建立了一個不可變的物件,而改變這個String的值實際上是對這

StringStringBufferStringBuilder的關係區別

String: String物件一旦建立就不能改變,如果通過"+"做連線,是從新開闢了空間來存新的字串,並把新字串的引用賦值給了變數,如果需要進行大量的字串修改操作,應該使用StringBuffer/StringBuilder/字元陣列,最終結果都可以轉換成String物件。 StringB

StringStringBufferStringBuilder區別

相信大家都知道StringBuffer、StringBuilder,但是這兩個的用法都差不多,到底有什麼區別呢,這也是面試的時候問的比較多的一道題,這裡我就來說說,這兩個的區別結合String來說~   String:檢視原始碼得知,String類的宣告是:public final,所以可以

StringStringBufferStringBuilder之間區別

①執行/執行速度: StringBuilder > StringBuffer > String   String StringBuffer StringBuilder 執行速度

面試題:StringStringBufferStringBuilder區別聯絡

上訴三個都屬於常見物件(API):具體的使用方法此處不再詳細列舉 String類: 字串:就是由多個字元組成的一串資料,也可以看成是一個字元陣列,通過檢視API可知: (1)字串字面值(如:“abc”)可以看成是一個字串物件; (2)字串是常量,一旦被賦值就不能被改變

StringStringbufferStringbuilder三者之間區別

1.首先說執行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物