String,StringBuilder 以及StringBuffer 這三個類別的關係與差異一直是Java 的經典問題,這次就來講一下關於這三個類別的一些知識
一.簡單對比
String : 字元常數
StringBuilder : 字元變數
StringBuffer : 字元變數
#String 屬於常數類型,被宣告為final class,所有的屬性也都是final 類型,因此String 物件一旦創建,便不可更改;
StringBuilder / StringBuffer 兩個類別屬於變數類型,是可以更改的,它們都是為了解決字串由於拼接產生太多中間物件的問題而提供的類別。
執行速度 StringBuilder >StringBuffer >String
線程安全:StringBuffer
非線程安全: StringBuilder
StringBuilder 在本質上和StringBuffer 沒有太大區別,但是由於StringBuilder 去掉了StringBuffer 擁有的線程安全部分,因此有效減少了開銷。因此,StringBuilder 是大部分情況下字串拼接操作的首選
二. String 處理字串
例一:
String s = "abcd"; s = s + "fgh";
很多人作這樣的字串處理的時候會誤以為String 類型是可變的。
但其實JVM 處理這段程式碼的過程是這樣的:首先創建s 對象,賦值“abcd” ,然後處理第二行程式碼時,再創建一個s 對象,賦值“abcdfgh”,然後將第一個s 對象垃圾回收。
所以相當於第一個s 沒更改過,第二個s 是新的物件
例二:
String str = “This is only a” + “simple” + “test”;
這段程式碼相當於String str = “This is only a simple test”;
例三:
String str2 = "This is only a"; String str3 = "simple"; String str4 = "test"; String str1 = str2 +str3 + str4;
這段程式碼同樣會按照例一的過程來處理
#三. StringBuilder / StringBuffer 建構特性
這兩個物件在建構的過程中,首先依照預設大小申請一個字元數組(char[]), 預設容量為16 個字符,但如果超出,會使用Arrays. copyOf() 成倍擴容16,32,64, 128...,當然這樣會影響效能,因此可以在建立物件時按照需要自訂其容量
//默认 16 个字符 public StringBuilder() { super(16); } //构造函数定义容量 public StringBuilder(int capacity) { super(capacity); }
四. String 與StringBuilder 處理字串拼接對比
我們都知道,進行字串拼接操作時推薦使用StringBuilder,但是是不是什麼時候都推薦使用StringBuilder 來取代String 進行字串拼接?顯然不是的。
例一:
String str = "123"; String str1 = str + "456"; String str2 = new StringBuilder().append(str).append("def").toString();
在這種情況下,兩種處理方式效率差異不大
在JDK 8 中, String 的字串拼接操作會被編譯器自動轉換為StringBuilder 並呼叫append 方法,由於這樣的最佳化方案,使得兩個類別在這種情況下的處理效率差異不大;而在JDK 9 中,為了更統一字串操作優化,提供了StringConcatFactory,作為一個統一的入口,更優化了字串拼接操作。
例二:
String str = ""; for (int i = 0; i < 1000; i++) { str += "12345"; } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 1000; i++) { stringBuilder.append("12345"); }
這種情況下,StringBuilder 更快
在循環中,每執行一次“ ”,都會建立一個String對象,因此會有大量物件創建和回收的消耗。
簡單來說,在迴圈中對同一個字串物件做字串拼接,優先選擇StringBuilder
例三
String str1 = "123" + "456" + "789"; String str2 = new StringBuilder("123").append("456").append("789").toString();
#這種情況下,String 更快
我們都知道String str1 = "123" "456" "789";
其實是等同於String str1 = "123456789";
的,而StringBuilder 反而需要多次呼叫append 方法。
以上是你必須搞清楚的String,StringBuilder,StringBuffer的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)