字串操作是程式設計中最常見的行為,Java語言中使用最廣泛的字串類是String類(還不知道String類的同學請看我之前的博客),很多初級程式設計,只使用了String類,但是,當我們想提升程式運行效率,提升程式設計水平的時候,我們需要深度理解另一個字串類SringBuilder,本文利用了反編譯工具,從JVM位元組碼的視角,深度探討了String和StringBuilder的區別和應用場景,
1、不可變的String
查看JDK檔案可知,String物件是不可變的,如果對字串進行拼接操作,每次拼接,都會構建一個新的String物件,看看下面的代碼:
public class StringDemo {
public static void main(String[] args) {
String s1 = "hello";
s1 = s1+"world";
System.out.println(s1);
}
}
為了證明上面代碼中拼接后的s1到底是不是一個新的String物件,可以使用JDK自帶的工具Javap來反編譯以上代碼,在cmd中輸入如下命令:
javap -c StringDemo
反編譯出來的檔案是匯編語言,即使你完全不懂匯編語言也無須擔心,我已經為這份反編譯檔案增添了詳細的注釋,你一定能看懂,附上反編譯檔案原始碼和注釋:

從反編譯的代碼中,我們可以知道,編譯器為我們自動創建了一個StringBuilder物件,用來拼接字串,在String拼接的時候,呼叫StringBuilder的append()方法,最后呼叫StringBuilder的toString()方法回傳結果,賦值給s1,
2、StringBuilder類簡介
StringBuilder是一個可變的字串類,我們可以把它看成一個容器,這里的可變指的是StringBuilder物件中的內容是可變的,我們用一段有關StringBuilder的代碼案例,介紹StringBuilder類的用法:
public class StringBuilderDemo {
public static void main(String[] args) {
//無參構造方法
StringBuilder sb = new StringBuilder();
sb.append("hello");//拼接字串
sb.append("world");
String s1 = sb.toString(); //StringBuilder轉換為字串
System.out.println(s1);
//有參構造方法
StringBuilder sb2 = new StringBuilder("hello world");
String s2 = sb2.toString();
System.out.println(s2);
}
}
3、String和StringBuilder使用場景
在前面,我們分析了,當String字串拼接時,編譯器會自動優化,自動創建StringBuilder,可能你會覺得可以隨意使用String物件,反正編譯器會為你自動優化性能,但是,有一個疑問,我們必須解決:編譯器到底可以為我們優化到什么程度?我們來更深入的看一看這個問題,請看下面的例子:假如現在要把一個String陣列拼接成一個字串,現在有兩種寫法
public class StringBuilderDemo {
public String implicit(String[] fields){
String result = "";
for (int i = 0; i <fields.length ; i++) {
result += fields[i];
}
return result;
}
public String explicit(String[] fields){
StringBuilder result = new StringBuilder();
for (int i = 0; i <fields.length ; i++) {
result.append(fields[i]);
}
return result.toString();
}
}
implicit方法每次for回圈都會創建一個新的StringBuilder物件,而explicit方法,只需要創建一個StringBuilder物件,顯然提高了程式的運行效率,
4、總結
- String是不可變字串
- StringBuilder是可變字串
- 單次字串拼接,建議使用String類,利用JVM自動優化
- 多次回圈拼接,建議使用StringBuilder,提高程式運行效率
/******************************************************************************************
* 作者簡介:本人擅長C++、Java和演算法開發,具有7年一線開發經驗,目前在某人工智能公司任技術總監,
* 歡迎關注我的公眾號【碼農充電站】,公眾號里為大家準備了編程干貨和精品專案原始碼
* 公眾號:碼農充電站
* 作者微信:it1529577
*****************************************************************************************/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277321.html
標籤:java
上一篇:普歌-逆越團隊:Java集合中的Map介面(詳細版)
下一篇:淺談設計模式及Singleton
