一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 辨析Java中的String與StringBuffer及StringBuilder字符串類

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

2020-05-01 13:18Charles JAVA教程

這里將為大家來辨析Java中的String與StringBuffer及StringBuilder字符串類型,通常來說StringBuilder的性能更加,需要的朋友可以參考下

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

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

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

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

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

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

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

JVM直接把上述語句當作:

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

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

?
1
2
3
4
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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");
  }

輸出:

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

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


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产综合久久消防器材 | 波多野结衣久久国产精品 | 韩国三级大全 | 羞羞在线观看 | 性美国人xxxxx18 | 女学生被老师调教在教室 | 全肉一女n男np高h双龙养成 | 嘉嘉的丝袜美腿白丝 | 国产成人永久免费视 | 亚洲社区在线观看 | 男人和女人日比 | 亚洲六月丁香六月婷婷色伊人 | 小寡妇好紧进去了好大看视频 | 免费在线观看亚洲 | 高清男的插曲女的 欢迎你老狼 | 青青国产在线视频 | 亚洲国产精品综合久久一线 | 国产成人综合手机在线播放 | 亚洲美洲国产日产 | 全黄h全肉细节文在线观看 全彩成人18h漫画 | 雪恋电影完整版免费观看 | 色综合亚洲天天综合网站 | 四虎精品影视 | 草草线在成年免费视频网站 | chaopeng在线视频进入 | 魔法满屋免费观看完整版中文 | 色老板视频| 惊弦45集免费看 | 2018高清国产一道国产 | 国产亚洲自愉自愉 | 色综合合久久天天综合绕视看 | 99热最新在线观看 | 精品国语对白精品自拍视 | 美国一级大黄大色毛片 | 国产午夜永久福利视频在线观看 | 日日操视频 | 日本在线看 | 亚洲网站在线播放 | 波多野结衣在线免费观看 | a韩剧 | 欧美国产在线观看 |