摘要:如果對(duì)于經(jīng)常改變內(nèi)容的字符串,使用效率高,但是它只適用于單線程的場(chǎng)景,在多線程場(chǎng)景下,容易導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象出現(xiàn)。多線程場(chǎng)景下,要使用。在大部分情況下,線程安全的可變字符序列。可將字符串緩沖區(qū)安全地用于多個(gè)線程。
本人博客 http://www.cnblogs.com/runfor... 總結(jié):
1.String是字符串常量,StringBuffer是線程安全的字符串變量,StringBuilder是直到JDK1.5才加入的線程不安全的字符串變量,之所以設(shè)計(jì)StringBuilder是為了單線程使用提高效率而考慮的。
2.效率問題,如果對(duì)于很少改變內(nèi)容的字符串,使用string效率高。如果對(duì)于經(jīng)常改變內(nèi)容的字符串,使用StringBuilder效率高,但是它只適用于單線程的場(chǎng)景,在多線程場(chǎng)景下,容易導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象出現(xiàn)。多線程場(chǎng)景下,要使用StringBuffer。
**String 類型和 StringBuffer 類型的主要性能區(qū)別其實(shí)在于String 是不可變的對(duì)象, 因此在每次對(duì) String 類型進(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)存中無引用對(duì)象多了以后, JVM 的 GC 就會(huì)開始工作,那速度是一定會(huì)相當(dāng)慢的。
而如果是使用 StringBuffer 類則結(jié)果就不一樣了,每次結(jié)果都會(huì)對(duì) StringBuffer 對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象,再改變對(duì)象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對(duì)象經(jīng)常改變的情況下。而在某些特別情況下, String 對(duì)象的字符串拼接其實(shí)是被 JVM 解釋成了 StringBuffer 對(duì)象的拼接。
String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你會(huì)很驚訝的發(fā)現(xiàn),生成 String S1 對(duì)象的速度簡(jiǎn)直太快了,而這個(gè)時(shí)候 StringBuffer 居然速度上根本一點(diǎn)都不占優(yōu)勢(shì)。其實(shí)這是 JVM 的一個(gè)把戲,在 JVM 眼里,這個(gè)
String S1 = “This is only a” + “ simple” + “test”; 其實(shí)就是:
String S1 = “This is only a simple test”; 所以當(dāng)然不需要太多的時(shí)間了。但大家這里要注意的是,如果你的字符串是來自另外的 String 對(duì)象的話,速度就沒那么快了,譬如:**
String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4;
**這時(shí)候 JVM 會(huì)規(guī)規(guī)矩矩的按照原來的方式去做。在大部分情況下 StringBuffer > String
StringBuffer,Java.lang.StringBuffer線程安全的可變字符序列。一個(gè)類似于 String 的字符串緩沖區(qū),但不能修改。雖然在任意時(shí)間點(diǎn)上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變?cè)撔蛄械拈L(zhǎng)度和內(nèi)容??蓪⒆址彌_區(qū)安全地用于多個(gè)線程??梢栽诒匾獣r(shí)對(duì)這些方法進(jìn)行同步,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個(gè)線程進(jìn)行的方法調(diào)用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數(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 > StringBuffer java.lang.StringBuilde
java.lang.StringBuilder一個(gè)可變的字符序列是5.0新增的。此類提供一個(gè)與StringBuffer 兼容的 API,但不保證同步。該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同。**
StinrgBuilder內(nèi)部實(shí)現(xiàn)機(jī)制如下:
public final class StringBuilder extends AbstractStringBuilder; AbstractStringBuilder(int capacity) { value = new char[capacity]; } public StringBuilder() { super(16); //默認(rèn)2的四次冪 } public StringBuilder(int capacity) { super(capacity); } public StringBuilder(String str) { super(str.length() + 16); append(str); } public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } public StringBuilder append(String str) { super.append(str); return this; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66002.html
摘要:事實(shí)上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。中可以通過設(shè)值注入方法注入和構(gòu)造器注入實(shí)現(xiàn),推薦使用的方式為設(shè)值注入。 寫在前面 春天來了,萬物復(fù)蘇的季節(jié)到了. 許多程序猿安奈不住生理需求,我要漲工資,我要跳槽. 畢竟金三銀四嘛. 那么要從眾多的面試者中獲得求職機(jī)會(huì),我們就要面對(duì)很多的面試題. 程序猿是最煩面試題的.面試的公司也煩,面試的人也煩. 但是沒辦法.面試的人魚龍混...
摘要:和它們都是可變的字符串,不過它們之間的區(qū)別是初中級(jí)面試出現(xiàn)幾率十分高的一道題。區(qū)別線程安全線程安全,線程不安全。區(qū)別性能既然是線程安全的,它的所有公開方法都是同步的,是沒有對(duì)方法加鎖同步的,所以毫無疑問,的性能要遠(yuǎn)大于。 StringBuffer 和 StringBuilder 它們都是可變的字符串,不過它們之間的區(qū)別是 Java 初中級(jí)面試出現(xiàn)幾率十分高的一道題。這么簡(jiǎn)單的一道題,棧...
摘要:當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見對(duì)象的學(xué)習(xí) StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時(shí)并且也耗內(nèi)存(每次都會(huì)構(gòu)造一個(gè)新的string對(duì)象),而這種拼接操作又...
摘要:的區(qū)別是不可變的,如果嘗試去修改,會(huì)新生成一個(gè)字符串對(duì)象,和是可變的是線程安全的,是線程不安全的,所以在單線程環(huán)境下效率會(huì)更高和有哪些區(qū)別首先,他們的底層數(shù)據(jù)結(jié)構(gòu)不同,底層是基于數(shù)組實(shí)現(xiàn)的,底層是基于鏈表實(shí)現(xiàn)的由于底層 ...
摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對(duì)象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時(shí)又保留了解釋型語言可移植的特點(diǎn)。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...
閱讀 2856·2021-11-02 14:42
閱讀 3226·2021-10-08 10:04
閱讀 1252·2019-08-30 15:55
閱讀 1088·2019-08-30 15:54
閱讀 2381·2019-08-30 15:43
閱讀 1740·2019-08-29 15:18
閱讀 928·2019-08-29 11:11
閱讀 2430·2019-08-26 13:52