String 重载 + 原理分析
一、疑問
昨天在逛知乎的時候看到有一個公司的面試題是關(guān)于 String 對象 的,大概意思是 String 類的 “+”是如何實現(xiàn)的,剛好前些天在書上有看到這個實現(xiàn)方式,現(xiàn)在寫出來供大家參考。下面先來大致了解一下 String 這個類:
public final class String extends Object implements Serializable, Comparable<String>, CharSequenceString 類底層是一個 final 修飾的 char 類型數(shù)組,意味著 String 類的對象是不可變的,所以 String 對象可以共享。
String 類中的每一個看起來會修改 String 值的方法,實際上都是創(chuàng)建了一個全新的 String 對象,用來包含修改后的字符串內(nèi)容,這也可以說明 String 對象具有只讀的屬性。
這種不可變性意味著存在著一定的效率問題。當(dāng)為 String 類重載 “+” 操作符就是一個例子。
public class StringTest {public static void main(String[] args) {String apple = "Apple,";String fruit = apple + "Pear," + "Orange";System.out.println(fruit);} }輸出
Apple,Pear,Orange
二、問題分析
不知道你們有沒有想過這段代碼是如何工作的,可能我們會想:String 類有一個 append() 的方法,它會生成一個新的 String 對象,以包含連接的字符串。
首先它會先連接 apple 與 Pear 生成一個對象,然后該對象再與 Orange 相連,生成另一個新的對象,以此類推,得到最終的 String 對象。
這種方式看似行得通,但是為了得到最終的 String 對象,會產(chǎn)生很多被垃圾回收機制回收的中間對象,這樣實現(xiàn)的性能肯定是及其糟糕的。
其實編譯器在執(zhí)行上述代碼的時候會的自動引入 java.lang.StringBuilder 類。雖然在上面的代碼中我們并沒有使用到 StringBuilder 類,但是編譯器卻自動引入了它,因為它更高效。
上面這個例子中,編譯器會創(chuàng)建一個 StringBuilder 對象,用來構(gòu)造最終要生成的 String,并為每一個字符串調(diào)用一次 StringBuilder 中的 append() 方法,因此上述代碼一共執(zhí)行了三次 append() 方法。最后調(diào)用 toString 生成最終的結(jié)果,并保存為 fruit。
三、代碼優(yōu)化
但是我們不能認為編譯器已經(jīng)幫我們做了優(yōu)化,我們就可以隨意的使用 String 對象。下面是兩種方法生成一個 String:一個方法使用了 String 對象,另一個使用了 StringBuilder。
public static String getString1(String[] strArray){String result = "";for(int i = 0; i < strArray.length; i++)result += strArray[i];return result;}public static String getString2(String[] strArray){StringBuilder result = new StringBuilder();for(int i = 0; i < strArray.length; i++)result.append(strArray[i]);return result.toString();}上面兩個方法都是用來對一個數(shù)組中的數(shù)據(jù)進行連接返回一個 String 對象但是需要我們注意的是 getString1 方法是在循環(huán)內(nèi)部構(gòu)造 StringBuilder 對象的,這意味著每循環(huán)一次就會創(chuàng)建一個新的 StringBuilder 對象。
getString2 方法只生成了一個 StringBuilder 對象,這樣更簡單更高效的實現(xiàn)了同 getString1 一樣的功能。所以在我們使用 String 對象時,最好考慮一下是否可以用 StringBuilder 對象更高效的實現(xiàn)我們想要的功能。
四、參考文獻
- 《Java 編程思想》Bruce Eckel 著 陳昊鵬 譯
總結(jié)
以上是生活随笔為你收集整理的String 重载 + 原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 古代朝鲜王出行的场面是什么
- 下一篇: 巴西的耕地比印度的耕地少的根本原因是什么