1. 程式人生 > >Java面試——String、StringBuider以及StringBuffer的區別和使用場景

Java面試——String、StringBuider以及StringBuffer的區別和使用場景

1.  為什麼我們需要StringBuffer類和StringBuilder類

String不可變的物件,因此在每次對String型別進行改變的時候,都會生成一個新的String物件,然後將指標指向新的String物件,所以經常改變內容的字串最好不要用String,因為每次生成物件會降低效能,當記憶體中無引用物件多了GC就會開始工作,效能就會降低。

不要使用String類的"+"來進行頻繁的拼接,因為效能是極差的,應該使用StringBuffer或StringBuilder類

如下的例子,就該使用第二種方案。

String result = "";  
for (String s : hugeArray) {  
    result = result + s;  
}  
  
// 使用StringBuilder  
StringBuilder sb = new StringBuilder();  
for (String s : hugeArray) {  
    sb.append(s);  
}  
String result = sb.toString();  

2.  StringBuiderStringBuffer的區別

StringBuilderStringBuffer有公共父類AbstractStringBuilder(抽象類)

StringBuffer對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的。

StringBuilder並沒有對方法進行加同步鎖,所以是非執行緒安全的。

3.  StringBuiderStringBuffer的使用場景

當單執行緒操作大量資料時,建議使用StringBuilder,速度更快(10%~15%左右的效能提升),畢竟同步有效能開銷。

多執行緒操作大量資料時,建議使用StringBuffer。可用於全域性變數中。

相同情況下StirngBuilder雖然比StringBuffer獲得10%~15%左右的效能提升,但卻要冒多執行緒不安全的風險。而在現實的模組化程式設計中,負責某一模組的程式設計師不一定能清晰地判斷該模組是否會放入多執行緒的環境中執行,因此除非確定系統的瓶頸是在StringBuffer上,並且確定你的模組不會執行在多執行緒模式下,才可以採用StringBuilder,否則還是用StringBuffer

4.  StringBuiderStringBuffer的實現原理

我們知道使用StringBufferStringBuider無非就是為了提高字串連線的效率,因為直接使用+進行字串連線會建立多個

String物件,造成一定的開銷。

AbstractStringBuilder中採用一個char陣列來儲存字串,char陣列有一個初始大小(16),當append的字串長度超過當前char陣列容量時,則對char陣列進行動態擴容,然後將當前char陣列拷貝到新的位置,因為重新分配記憶體並拷貝的開銷比較大,所以每次都是進行固定擴容2倍的方式(使用JNI方法System.arraycopy())。

最後就是,為了獲得更好的效能,在構造StirngBufferStirngBuilder時應儘可能指定它們的容量。當然,如果你操作的字串長度(length)不超過16個字元就不用了,因為預設容量為16。不指定容量會顯著降低效能。

StringBuilder();//建立一個容量為16的StringBuilder物件(16個空元素)
StringBuilder(int initCapacity);//建立一個容量為initCapacity的StringBuilder物件
StringBuilder(CharSequence c);//建立一個包含c的StringBuilder物件,末尾附加16個空元素
StringBuilder(String s);//建立一個包含s的StringBuilder物件,末尾附加16個空元素


相關推薦

Java面試——StringStringBuider以及StringBuffer區別使用場景

1.  為什麼我們需要StringBuffer類和StringBuilder類String是不可變的物件,因此在每次對String型別進行改變的時候,都會生成一個新的String物件,然後將指標指向新的

JavaStringStringBuilder以及StringBuffer

1.String底層使用final修飾的類: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /*

探祕Java中的StringStringBuilder以及StringBuffer

探祕Java中String、StringBuilder以及StringBuffer   相信String這個類是Java中使用得最頻繁的類之一,並且又是各大公司面試喜歡問到的地方,今天就來和大家一起學習一下String、StringBuilder和StringBuffe

javaStringStringBufferStringBuilder的區別(簡單介紹)

情況 string 建議 code serializa 就是 同步 安全性 之間 簡單介紹 java中用於處理字符串常用的有三個類: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder

Java基礎知識(JAVAStringStringBufferStringBuilder類的區別

pen 順序 ava tps 進行 exp ringbuf https 對他 java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,他們之間的區別也是經常在面試中會問到的問題。現在總結一下,看看他們的不同與相同。

JavaString StringBuffer StringBuilder區別

1.可變與不可變 String類中使用字元陣列儲存字串,如下就是,因為有“final”修飾符,所以可以知道string物件是不可變的。 private final char value[]; StringBuilder與StringBuffer都繼承自AbstractStringBu

JavaString StringBufferStringBuilder的區別

String 類是不可改變的,所以你一旦建立了 String 物件,那它的值就無法改變了 StringBuffer 和 StringBuilder 類相同點: StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。 Str

JavaStringStringBufferStringBuilder的區別

近期看到StringBuffer,便搜尋整理了一些關於String、StringBuffer和StringBuilder的東西,僅供分享參考。 1、String String:字串常量,字串長度不可變的。Java中String是immutable(不可變)的。先看原始碼: public

圖解JavaStringStringBufferStringBuilder的區別

圖解Java中String、StringBuffer和StringBuilder的區別 參考部落格:https://blog.csdn.net/weixin_41101173/article/details/79677982 一、Java中的 String 類——String 是字串常量 1、字

JAVAStringStringBufferStringBuilder 的區別

① String類是final類,也即意味著String類不能被繼承,並且它的成員方法都預設為final方法。在Java中,被final修飾的類是不允許被繼承的,並且該類中的成員方法都預設為final方法。在早期的JVM實現版本中,被final修飾的方法會被轉為內嵌呼叫以提升執行效率。而從J

Java基礎——StringStringBuilerStringBuffer的用法區別

1.區別 1.1 三者本質區別 String:每次增加資料都會開闢新空間,儲存資料,將上一塊空間通過GC進行回收 StringBuiler、StringBuffer:是可變長度,資料增加是直接在現有空間進行操作 1.2 StringBuiler StringBuffer

Java學習筆記總結:JAVAStringStringBuilderStringBuffer類的區別

不斷地學習,不斷地填充自己的技術庫,學習Java已經有一段時間了,由一開始的不適應到後來的足以靈活應對,不僅僅取決於老師的精緻講課,還有就是依靠我的學習祕籍:記錄自己的學習筆記。今天給大家分享的技術學習筆記是JAVAString,StringBuilder以及StringBuffer這三個類之間的區

JavaStringStringBufferStringBuilder的區別

 java中String、StringBuffer、StringBuilder是程式設計中經常使用的字串類,他們之間的區別也是經常在面試中會問到的問題。現在總結一下,看看他們的不同與相同。 1.可變與不可變   String類中使用字元陣列儲存字串,如下就是,因為有“fi

JAVAStringStringBufferStringBuilder的區別

1、String不可以改變,StringBuffer和StringBuilder都是可以改變的 2、StringBuffer是同步的,資料安全,但是效率低。StringBuilder不是同步的,效率高

JAVAStringStringBuilderStringBuffer類的區別

StringBuffer類(或者StringBuilder)和String一樣,也用來代表字串,只是由於StringBuffer的內部實現方式和String不同,所以StringBuffer在進行字串處理時,不生成新的物件,在記憶體使用上要優於String類。

JavaString類的isEmpty方法null以及""的區別

一直以來對String的這三個空挺暈的,剛好同事問我,我也學習下。從別人部落格上看到的是這樣的:     isEmpty()         分配了記憶體空間,值為空,是絕對的空,是一種有值(值 =

JavaStringStringBufferStringBuilder的區別與使用。

1 String String:字串常量,字串長度不可變。Java中String是immutable(不可變)的。 String類的包含如下定義: /** The value is used for character storage. */ privatefinalchar value[];  

JavaStringStringBuilderStringBuffer區別

ring 非線程安全 安全 字符串變量 buffer java 不可 ringbuf lock 常量還是變量: String是字符串常量(以final修飾符進行修飾,不可更改); StringBuilder是字符串變量 StringBuffer是字符串變量 線程安全:

JavaStringStringBuilderStringBuffer常用源碼分析及比較(一):String源碼分析

array string類 都是 epo sys 匹配字符串 bound 地址 簡單 String: 一、成員變量: /** The value is used for character storage. */ private final char value[

JavaStringStringBuilderStringBuffer常用源碼分析及比較(二):StringBuilderStringBuffer源碼分析

string類型 character private 字符 代碼 less pri des over StringBuilder: 一、構造方法: /** * Constructs a string builder with no characters in i