最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

辨析Java中的String與StringBuffer及StringBuilder字符串類

 更新時間:2016年05月18日 16:43:39   作者:Charles  
這里將為大家來辨析Java中的String與StringBuffer及StringBuilder字符串類型,通常來說StringBuilder的性能更加,需要的朋友可以參考下

1 String
String:字符串常量,字符串長度不可變。

2 StringBuffer
StringBuffer:字符串變量(Synchronized,即線程安全)。如果要頻繁對字符串內(nèi)容進行修改,出于效率考慮最好使用StringBuffer,如果想轉(zhuǎn)成String類型,可以調(diào)用StringBuffer的toString()方法。
Java.lang.StringBuffer線程安全的可變字符序列。在任意時間點上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變該序列的長度和內(nèi)容??蓪⒆址彌_區(qū)安全地用于多個線程。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將?定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append 方法始終將這些字符添加到緩沖區(qū)的末端;而 insert 方法則在指定的點添加字符。例如,如果 z 引用一個當前內(nèi)容是“start”的字符串緩沖區(qū)對象,則此方法調(diào)用 z.append("le") 會使字符串緩沖區(qū)包含“startle”,而 z.insert(4, "le") 將更改字符串緩沖區(qū),使之包含“starlet”。

3 StringBuilder
StringBuilder:字符串變量(非線程安全)。
java.lang.StringBuilder是一個可變的字符序列,是JDK5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設(shè)計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因?在大多數(shù)實現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同。
在大部分情況下,StringBuilder > StringBuffer。

4 三者區(qū)別
String 類型和StringBuffer的主要性能區(qū)別:String是不可變的對象, 因此在每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因?每次生成對象都會對系統(tǒng)性能產(chǎn)生影響,特別當內(nèi)存中無引用對象多了以后, JVM 的 GC 就會開始工作,性能就會降低。
使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象并改變對象引用。所以多數(shù)情況下推薦使用 StringBuffer ,特別是字符串對象經(jīng)常改變的情況下。
在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度并不會比 StringBuffer 對象慢,例如:

 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

生成 String S1 對象的速度并不比 StringBuffer慢。其實在 JVM 里,自動做了如下轉(zhuǎn)換:

 String S1 = “This is only a” + “ simple” + “test”; 

JVM直接把上述語句當作:

String S1 = “This is only a simple test”;

所以速度很快。但要注意的是,如果拼接的字符串來自另外的String對象的話,JVM就不會自動轉(zhuǎn)換了,速度也就沒那么快了,例如:

String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

這時候,JVM 會規(guī)規(guī)矩矩的按照原來的方式去做。
在大部分情況下,StringBuffer > String。

4.StringBuffer和StringBuilder
二者幾乎沒什么區(qū)別,基本都是在調(diào)用父類的各個方法,一個重要的區(qū)別就是StringBuffer是線程安全的,內(nèi)部的大多數(shù)方法前面都有關(guān)鍵字synchronized,這樣就會有一定的性能消耗,StringBuilder是非線程安全的,所以效率要高些。

public static void main(String[] args) throws Exception { 
    String string = "0"; 
    int n = 10000; 
    long begin = System.currentTimeMillis(); 
    for (int i = 1; i < n; i++) { 
      string += i; 
    } 
    long end = System.currentTimeMillis(); 
    long between = end - begin; 
    System.out.println("使用String類耗時:" + between+"ms"); 
 
    int n1 = 10000; 
    StringBuffer sb = new StringBuffer("0"); 
    long begin1 = System.currentTimeMillis(); 
    for (int j = 1; j < n1; j++) { 
      sb.append(j); 
    } 
    long end1 = System.currentTimeMillis(); 
    long between1 = end1 - begin1; 
    System.out.println("使用StringBuffer類耗時:" + between1+"ms"); 
 
    int n2 = 10000; 
    StringBuilder sb2 = new StringBuilder("0"); 
    long begin2 = System.currentTimeMillis(); 
    for (int k = 1; k < n2; k++) { 
      sb2.append(k); 
    } 
    long end2 = System.currentTimeMillis(); 
    long between2 = end2 - begin2; 
    System.out.println("使用StringBuilder類耗時:" + between2+"ms"); 
  } 

輸出:

使用String類耗時:982ms
使用StringBuffer類耗時:2ms
使用StringBuilder類耗時:1ms

雖然這個數(shù)字每次執(zhí)行都不一樣,而且每個機子的情況也不一樣,但是有幾點是確定的,String類消耗的明顯比另外兩個多得多。還有一點就是,StringBuffer要比StringBuilder消耗的多,盡管相差不明顯。


5 使用策略
(1)基本原則:如果要操作少量的數(shù)據(jù),用String ;單線程操作大量數(shù)據(jù),用StringBuilder ;多線程操作大量數(shù)據(jù),用StringBuffer。
(2)不要使用String類的"+"來進行頻繁的拼接,因?那?的性能極差的,應(yīng)該使用StringBuffer或StringBuilder類,這在Java的優(yōu)化上是一條比較重要的原則。舉個例子:在使用String 的時候,拼接字符串時使用“+”在JVM上形成臨時的StringBuffer對象,同時在每一個字符串上都建立一個對象,拼接了兩個字符串一共需要創(chuàng)建4個對象?。ㄒ粋€保存結(jié)果的String,兩個字符串對象,一個臨時的StringBuffer對象)。而使用StringBuffer的話,只需創(chuàng)建2個對象!一個StringBuffer對象和保存最后結(jié)果的的String對象 。
(3)?了獲得更好的性能,在構(gòu)造 StirngBuffer 或 StirngBuilder 時應(yīng)盡可能指定它們的容量。當然,如果你操作的字符串長度不超過 16 個字符就不用了。不指定容量會顯著降低性能。
(4)StringBuilder一般使用在方法內(nèi)部來完成類似"+"功能,因?是線程不安全的,所以用完以后可以丟棄。StringBuffer主要用在全局變量中。
(5)相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風(fēng)險。而在現(xiàn)實的模塊化編程中,負責(zé)某一模塊的程序員不一定能清晰地判斷該模塊是否會放入多線程的環(huán)境中運行,因此:除非確定系統(tǒng)的瓶頸是在 StringBuffer 上,并且確定你的模塊不會運行在多線程模式下,才可以采用StringBuilder;否則還是用StringBuffer。

相關(guān)文章

  • 深入解析Java的包(package)

    深入解析Java的包(package)

    這篇文章主要介紹了深入解析Java的包(package),是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • 關(guān)于springboot配置文件密文解密方式

    關(guān)于springboot配置文件密文解密方式

    這篇文章主要介紹了關(guān)于springboot配置文件密文解密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Maven項目繼承實現(xiàn)過程圖解

    Maven項目繼承實現(xiàn)過程圖解

    這篇文章主要介紹了Maven項目繼承實現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 從0開始教你開發(fā)一個springboot應(yīng)用

    從0開始教你開發(fā)一個springboot應(yīng)用

    這篇文章主要為大家介紹了從0開始開發(fā)一個springboot應(yīng)用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java實現(xiàn)插入排序算法可視化的示例代碼

    Java實現(xiàn)插入排序算法可視化的示例代碼

    插入排序的算法描述是一種簡單直觀的排序算法。其原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將用Java語言實現(xiàn)插入排序算法并進行可視化,感興趣的可以了解一下
    2022-08-08
  • java動態(tài)目錄樹的實現(xiàn)示例

    java動態(tài)目錄樹的實現(xiàn)示例

    在開發(fā)過程中,常常需要對目錄結(jié)構(gòu)進行操作和展示,本文主要介紹了java動態(tài)目錄樹的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • java中TESTful架構(gòu)原理分析

    java中TESTful架構(gòu)原理分析

    這篇文章主要介紹了對java架構(gòu)中TESTful架構(gòu)原理進行了詳細的原理分析,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進步,早日升職加薪
    2021-09-09
  • Java設(shè)計模式之代理模式(Proxy模式)介紹

    Java設(shè)計模式之代理模式(Proxy模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之代理模式(Proxy模式)介紹,本文講解了為什么要使用代理模式、如何使用代理模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 關(guān)于spring中bean注冊的優(yōu)先級分析

    關(guān)于spring中bean注冊的優(yōu)先級分析

    Spring框架中,Bean的定義方式主要有三種:XML定義、注解掃描和配置類中的@Bean注解,在Bean注冊過程中,XML定義的GenericBeanDefinition優(yōu)先級最高
    2024-09-09
  • springBoot不同module之間互相依賴的實現(xiàn)

    springBoot不同module之間互相依賴的實現(xiàn)

    本文主要介紹了springBoot不同module之間互相依賴的實現(xiàn),不同模塊之間的依賴通常是通過Maven或Gradle來管理的,下面就來介紹一下如何實現(xiàn),感興趣的可以了解一下
    2024-08-08

最新評論

合山市| 肥西县| 神农架林区| 松阳县| 左权县| 贡嘎县| 桑日县| 永清县| 江孜县| 凌海市| 正阳县| 昭觉县| 高阳县| 信丰县| 雷波县| 宣武区| 休宁县| 屏边| 财经| 昌图县| 永修县| 庄河市| 凤城市| 平远县| 湘乡市| 吴旗县| 台东县| 澄江县| 新营市| 罗定市| 黄平县| 韩城市| 新邵县| 抚远县| 屏南县| 都昌县| 扎鲁特旗| 宁波市| 永安市| 江阴市| 蒲城县|