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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

String 重载 + 原理分析

發布時間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String 重载 + 原理分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、疑問

昨天在逛知乎的時候看到有一個公司的面試題是關于 String 對象 的,大概意思是 String 類的 “+”是如何實現的,剛好前些天在書上有看到這個實現方式,現在寫出來供大家參考。下面先來大致了解一下 String 這個類:

public final class String extends Object implements Serializable, Comparable<String>, CharSequence

String 類底層是一個 final 修飾的 char 類型數組,意味著 String 類的對象是不可變的,所以 String 對象可以共享。

String 類中的每一個看起來會修改 String 值的方法,實際上都是創建了一個全新的 String 對象,用來包含修改后的字符串內容,這也可以說明 String 對象具有只讀的屬性。

這種不可變性意味著存在著一定的效率問題。當為 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 對象,會產生很多被垃圾回收機制回收的中間對象,這樣實現的性能肯定是及其糟糕的。

其實編譯器在執行上述代碼的時候會的自動引入 java.lang.StringBuilder 類。雖然在上面的代碼中我們并沒有使用到 StringBuilder 類,但是編譯器卻自動引入了它,因為它更高效。

上面這個例子中,編譯器會創建一個 StringBuilder 對象,用來構造最終要生成的 String,并為每一個字符串調用一次 StringBuilder 中的 append() 方法,因此上述代碼一共執行了三次 append() 方法。最后調用 toString 生成最終的結果,并保存為 fruit。

三、代碼優化

但是我們不能認為編譯器已經幫我們做了優化,我們就可以隨意的使用 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();}

上面兩個方法都是用來對一個數組中的數據進行連接返回一個 String 對象但是需要我們注意的是 getString1 方法是在循環內部構造 StringBuilder 對象的,這意味著每循環一次就會創建一個新的 StringBuilder 對象。

getString2 方法只生成了一個 StringBuilder 對象,這樣更簡單更高效的實現了同 getString1 一樣的功能。所以在我們使用 String 對象時,最好考慮一下是否可以用 StringBuilder 對象更高效的實現我們想要的功能。

四、參考文獻

  • 《Java 編程思想》Bruce Eckel 著 陳昊鵬 譯

總結

以上是生活随笔為你收集整理的String 重载 + 原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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