你必須搞清楚的String,StringBuilder,StringBuffer
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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

stringbuilder清空的方法有:1、使用setLength(0)方法清空StringBuilder物件;2、使用delete(0, length)方法清空StringBuilder物件;3、使用replace(0, length, "")方法清空StringBuilder物件;4 、使用new StringBuilder()重新建立一個新的StringBuilder物件。

Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容String類別是Java中常用的字串處理類,它具有許多常用的方法可用於字串的操作。然而,在某些情況下,我們需要對字串進行頻繁的修改,而String類別的不可變性會導致頻繁的創建新的字串對象,從而影響效能。為了解決這個問題,Java提供了StringBuilder類,它

StringBuilder類別的append()方法接受String值並將其新增至目前物件。將字串值轉換為StringBuilder物件-取得字串值。附加使用append()方法將字串取得到StringBuilder。範例在下面的Java程式中,我們是將字串陣列轉換為單一StringBuilder物件。 即時示範publicclassStringToStringBuilder{ publicstaticvoidmain(Stringargs[]){&a

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

Java文件解讀:StringBuilder類別的substring()方法詳細介紹引言:在Java程式設計中,字串的處理是非常常見的操作之一。而Java提供了一系列關於字串處理的類別和方法,其中StringBuilder類別是常用於頻繁字串操作的選擇。在StringBuilder類別中,substring()方法是一個非常有用的方法,用來截取字串的子字串。本文將

大家好,今天跟大家分享java基礎之String。 String類別的重要性就不必說了,可以說是我們後端開發用的最多的類,所以,很有必要好好聊聊它。
