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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中String、StringBuffer、StringBuilder三者的区别

發(fā)布時(shí)間:2023/12/13 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中String、StringBuffer、StringBuilder三者的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、簡(jiǎn)介


? ? ? String、StringBuffer、StringBuilder三個(gè)類(lèi)之間的區(qū)別主要是在兩個(gè)方面:運(yùn)行速度和線程安全


二、區(qū)別


1、運(yùn)行速度,或者說(shuō)是執(zhí)行速度

? ? ??在這方面運(yùn)行速度快慢為:StringBuilder > StringBuffer > String

String

? ? ? String為字符串常量是不可變的對(duì)象,因此在每次對(duì) String 類(lèi)型進(jìn)行改變的時(shí)候其實(shí)都等同于生成了一個(gè)新的 String 對(duì)象,然后將指針指向新的 String 對(duì)象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因?yàn)槊看紊蓪?duì)象都會(huì)對(duì)系統(tǒng)性能產(chǎn)生影響,特別當(dāng)內(nèi)存中無(wú)引用對(duì)象多了以后, JVM 的 GC 就會(huì)開(kāi)始工作,那速度是一定會(huì)相當(dāng)慢的。

以下面一段代碼為例:

String str = "abc"; System.out.println(str); str = str + "de"; System.out.println(str);

輸出結(jié)果為:

abc abcde

? ? ? 從輸出結(jié)果看,好像是str這個(gè)對(duì)象被更改了,其實(shí),這只是一種假象罷了,JVM對(duì)于這幾行代碼是這樣處理的,首先創(chuàng)建一個(gè)String對(duì)象str,并把“abc”賦值給str,然后在第三行中,其實(shí)JVM又創(chuàng)建了一個(gè)新的對(duì)象也名為str,然后再把原來(lái)的str的值和“de”加起來(lái)再賦值給新的str,而原來(lái)的str就會(huì)被JVM的垃圾回收機(jī)制(GC)給回收掉了,所以,str實(shí)際上并沒(méi)有被更改,也就是前面說(shuō)的String對(duì)象一旦創(chuàng)建之后就不可更改了。所以,Java中對(duì)String對(duì)象進(jìn)行的操作實(shí)際上是一個(gè)不斷創(chuàng)建新的對(duì)象并且將舊的對(duì)象回收的一個(gè)過(guò)程,所以執(zhí)行速度很慢。

StringBuffer

? ? ? StringBuffer是字符串變量,對(duì)變量進(jìn)行操作就是直接對(duì)該對(duì)象進(jìn)行更改,而不進(jìn)行創(chuàng)建和回收的操作,所以速度要比String快很多

? ? ? 而在某些特別情況下, String 對(duì)象的字符串拼接其實(shí)是被 JVM 解釋成了 StringBuffer 對(duì)象的拼接,所以這些時(shí)候 String 對(duì)象的速度并不會(huì)比 StringBuffer 對(duì)象慢,而特別是以下的字符串對(duì)象生成中, String 效率是遠(yuǎn)要比 StringBuffer 快的:

String str = "abc"+"de"; StringBuilder stringBuilder = new StringBuilder().append("abc").append("de"); System.out.println(str); System.out.println(stringBuilder.toString());

輸出結(jié)果為:

abcde abcde

? ? ? 你會(huì)很驚訝的發(fā)現(xiàn),String的速度卻比StringBuilder的反應(yīng)速度要快很多,其實(shí)這是 JVM 的一個(gè)把戲,在 JVM 眼里,這個(gè):

String str="abc"+"de";

其實(shí)就是:

String str = "abcde";

? ? ? 所以當(dāng)然不需要太多的時(shí)間了。但大家這里要注意的是,如果你的字符串是來(lái)自另外的 String 對(duì)象的話,速度就沒(méi)那么快了,譬如:

String str1 = "abc"; String str2 = "de"; String str3 = str1 + str2;

? ? ? 那么JVM就會(huì)像上面說(shuō)的那樣,不斷的創(chuàng)建、回收對(duì)象來(lái)進(jìn)行這個(gè)操作了。速度就會(huì)很慢。

StringBuilder

? ? ??StringBuilder是字符串變量,用法與StringBuffer基本相同,但是它的運(yùn)行速度比StringBuffer要快,因?yàn)镾tringBuilder是線程不安全的,而StringBuffer是線程安全,少了同步操作,因此StringBuilder比StringBuffer要快些。


2、線程安全

在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。

StringBuffer

Java.lang.StringBuffer線程安全的可變字符序列。一個(gè)類(lèi)似于 String 的字符串緩沖區(qū),但不能修改。雖然在任意時(shí)間點(diǎn)上它都包含某種特定的字符序列,但通過(guò)某些方法調(diào)用可以改變?cè)撔蛄械拈L(zhǎng)度和內(nèi)容。

StringBuffer對(duì)象在字符串緩沖區(qū)被多個(gè)線程使用時(shí),StringBuffer中很多方法可以帶有synchronized關(guān)鍵字,所以可以保證線程是安全的,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個(gè)線程進(jìn)行的方法調(diào)用順序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類(lèi)型的數(shù)據(jù)。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append 方法始終將這些字符添加到緩沖區(qū)的末端;而 insert 方法則在指定的點(diǎn)添加字符。

例如:

如果 z 引用一個(gè)當(dāng)前內(nèi)容是“start”的字符串緩沖區(qū)對(duì)象,則此方法調(diào)用 z.append("le") 會(huì)使字符串緩沖區(qū)包含“startle”,而 z.insert(4, "le") 將更改字符串緩沖區(qū),使之包含“starlet”。

StringBuilder

StringBuilder一個(gè)可變的字符序列是5.0新增的。此類(lèi)提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步。該類(lèi)被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類(lèi),因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer 要快。


3、總結(jié)

String:適用于少量的字符串操作的情況

StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況

StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況


總結(jié)

以上是生活随笔為你收集整理的Java中String、StringBuffer、StringBuilder三者的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。