日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

String/StringBuffer/StringBuilder的执行效率以及区别

發布時間:2025/3/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String/StringBuffer/StringBuilder的执行效率以及区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.String、StringBuffer、StringBuilder的異同?
相同點:底層使用char[]進行存儲
不同點:
String:不可變的字符序列
StringBuffer:可變的字符序列:線程安全的(可同步訪問),效率低;
StringBuilder:jdk5.0新增,與StringBuffer一樣是可變的字符序列,但線程不安全的,所以效率較高;
2.String、StringBuffer、StringBuilder三者的效率從高到低排列應該是什么順序?
從高到低:StringBuilder > StringBuffer > String;
3.開發中建議 根據線程安全來選擇使用: StringBuffer(int capacity) / StringBuilder(int capacity);

  • 源碼分析String、StringBuffer、StringBuilder底層存儲與預分配內存
/*String str = new String(); //char[] value = new char[0];String str1 = new String("abc"); //char[] value = new char[]{'a','b','c'};StringBuffer sb1 = new StringBuffer(); //char[] value = new char[16]; 底層創建了一個長度16的數組System.out.println(sb1.length());//0sb1.append('a'); //value[0] = 'a';sb1.append('b'); //value[1] = 'b';StringBuffer sb2 = new StringBuffer("abc"); //char[] value = new char["abc".length + 16];System.out.println(sb2.length()); // 3//StringBuffer給了3+16個長度,但是我只用到了3個,所以sb2.length()=3, not value.length;*/

tips:
1.System.out.println(sb2.length()); // 3, StringBuffer底層會默認給到16個數組位置,如果你創建了3個,則就代表StringBuffer底層分配給你3+16=19個可以存放數組的位置,但是我初始化只用到3個,那么數組長度就還是3。
比如:一個房間可以占滿100個人,但是只進去了10個人,要問房間現在的容量是多少?那當然是10,而不是100.
2.擴容問題:如果要添加的數據底層數組盛不下了,就需要擴容數組;
默認情況下,擴容為原來容量capacity的2倍+2,同時將原有數組中的元素復制到新的數組中。

eg:

StringBuffer sb = new StringBuffer();System.out.println(sb.length()); //0
  • StringBuffer的常用方法/StringBuilder相同

    注:涉及到start與end位置的,都是左閉右開[start,end)!!

    增: StringBuffer append(xxx);
    刪: StringBuffer delete(int start, int end): 刪除指定[start,end)位置的內容;
    改:public void setCharAt(int n ,char ch) / StringBuffer replace(int start, int end, String str):把[start, end)位置替換為str;
    查:public char charAt(int n);
    插: StringBuffer insert(int offset, xxx): 在指定位置插入xxx;
    長度:public int length();

    增刪改查插可不需返回值,即直接調用append() / delete() / setCharAt() / charAt() / insert()方法。
    ------------------------------------------------------------------------------------------------常用------------------------------------------------------------
    StringBuffer reverse() :對當前字符序列進行逆轉操作
    public int indexOf(String str):
    public String substring(int start, int end):返回[start,end)區間的子字符串,不是切割當前字符串,所以得需要返回值。

@Testpublic void test(){StringBuffer s1 = new StringBuffer("abc");//StringBuffer append(xxx)用于增加字符串s1.append(1);s1.append('2');System.out.println(s1);//abc12//StringBuffer replace(int start, int end, String str):用于替換指定[start,end)位置的字符串s1.replace(2,4,"hello");System.out.println(s1); //abhello2System.out.println(s1.length());//8// StringBuffer delete(int start, int end):用于刪除字符串s1.delete(2, 4);System.out.println(s1);//abllo2 // StringBuffer delete = s1.delete(2, 4);//可以有返回值// StringBuffer insert(int offset, xxx):用于在某個位置添加字符串s1.insert(2,false);//false看成5個字符System.out.println(s1);//abfalsello2System.out.println(s1.length());//11//反轉字符串s1.reverse();System.out.println(s1);//2olleslafba//public String substring(int start, int end):取出指定[start,end)位置的子字符串String s2 = s1.substring(1,3);//注意:substring(),純小寫!!!System.out.println(s2);//ol}

== tips: substring()方法是純小寫!!==

  • 對比String、StringBuffer、StringBuilder三者的效率
@Testpublic void test(){//初始設置long startTime = 0L;long endTime = 0L;String text = "";StringBuffer buffer = new StringBuffer("");StringBuilder builder = new StringBuilder("");//開始對比//StringBuffer時間:startTime = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {buffer.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuffer的執行時間為:" + (endTime - startTime));//StringBuilder時間:startTime = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {builder.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuilder的執行時間為:" + (endTime - startTime));//String時間:startTime = System.currentTimeMillis();for (int i = 0; i < 10000; i++) {text = text + i;}endTime = System.currentTimeMillis();System.out.println("String的執行時間為:" + (endTime - startTime)); }

運行結果:

總結

以上是生活随笔為你收集整理的String/StringBuffer/StringBuilder的执行效率以及区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。