成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

面試題:Stirng、StringBuffer、StringBuilder

zhoutk / 1716人閱讀

摘要:如果對于經(jīng)常改變內(nèi)容的字符串,使用效率高,但是它只適用于單線程的場景,在多線程場景下,容易導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象出現(xiàn)。多線程場景下,要使用。在大部分情況下,線程安全的可變字符序列。可將字符串緩沖區(qū)安全地用于多個線程。

本人博客 http://www.cnblogs.com/runfor... 總結(jié):

1.String是字符串常量,StringBuffer是線程安全的字符串變量,StringBuilder是直到JDK1.5才加入的線程不安全的字符串變量,之所以設(shè)計StringBuilder是為了單線程使用提高效率而考慮的。
2.效率問題,如果對于很少改變內(nèi)容的字符串,使用string效率高。如果對于經(jīng)常改變內(nèi)容的字符串,使用StringBuilder效率高,但是它只適用于單線程的場景,在多線程場景下,容易導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象出現(xiàn)。多線程場景下,要使用StringBuffer。

闡述:

**String 類型和 StringBuffer 類型的主要性能區(qū)別其實在于String 是不可變的對象, 因此在每次對 String 類型進(jìn)行改變的時候其實都等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因為每次生成對象都會對系統(tǒng)性能產(chǎn)生影響,特別當(dāng)內(nèi)存中無引用對象多了以后, JVM 的 GC 就會開始工作,那速度是一定會相當(dāng)慢的。
而如果是使用 StringBuffer 類則結(jié)果就不一樣了,每次結(jié)果都會對 StringBuffer 對象本身進(jìn)行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經(jīng)常改變的情況下。而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接。

 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

你會很驚訝的發(fā)現(xiàn),生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優(yōu)勢。其實這是 JVM 的一個把戲,在 JVM 眼里,這個
String S1 = “This is only a” + “ simple” + “test”; 其實就是:
String S1 = “This is only a simple test”; 所以當(dāng)然不需要太多的時間了。但大家這里要注意的是,如果你的字符串是來自另外的 String 對象的話,速度就沒那么快了,譬如:**

String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

**這時候 JVM 會規(guī)規(guī)矩矩的按照原來的方式去做。在大部分情況下 StringBuffer > String
StringBuffer,Java.lang.StringBuffer線程安全的可變字符序列。一個類似于 String 的字符串緩沖區(qū),但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變該序列的長度和內(nèi)容??蓪⒆址彌_區(qū)安全地用于多個線程??梢栽诒匾獣r對這些方法進(jìn)行同步,因此任意特定實例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個線程進(jìn)行的方法調(diào)用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append 方法始終將這些字符添加到緩沖區(qū)的末端;而 insert 方法則在指定的點添加字符。
例如,如果 z 引用一個當(dāng)前內(nèi)容是“start”的字符串緩沖區(qū)對象,則此方法調(diào)用 z.append("le") 會使字符串緩沖區(qū)包含“startle”,而 z.insert(4, "le") 將更改字符串緩沖區(qū),使之包含“starlet”。在大部分情況下

StringBuilder > StringBuffer
java.lang.StringBuilde

java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與StringBuffer 兼容的 API,但不保證同步。該類被設(shè)計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因為在大多數(shù)實現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同。**

StinrgBuilder內(nèi)部實現(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66002.html

相關(guān)文章

  • 這些Java面試必須會-----魯迅

    摘要:事實上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。中可以通過設(shè)值注入方法注入和構(gòu)造器注入實現(xiàn),推薦使用的方式為設(shè)值注入。 寫在前面 春天來了,萬物復(fù)蘇的季節(jié)到了. 許多程序猿安奈不住生理需求,我要漲工資,我要跳槽. 畢竟金三銀四嘛. 那么要從眾多的面試者中獲得求職機(jī)會,我們就要面對很多的面試題. 程序猿是最煩面試題的.面試的公司也煩,面試的人也煩. 但是沒辦法.面試的人魚龍混...

    aristark 評論0 收藏0
  • StringBufferStringBuilder 的 3 個區(qū)別

    摘要:和它們都是可變的字符串,不過它們之間的區(qū)別是初中級面試出現(xiàn)幾率十分高的一道題。區(qū)別線程安全線程安全,線程不安全。區(qū)別性能既然是線程安全的,它的所有公開方法都是同步的,是沒有對方法加鎖同步的,所以毫無疑問,的性能要遠(yuǎn)大于。 StringBuffer 和 StringBuilder 它們都是可變的字符串,不過它們之間的區(qū)別是 Java 初中級面試出現(xiàn)幾率十分高的一道題。這么簡單的一道題,棧...

    ranwu 評論0 收藏0
  • String、StringBuilder、StringBuffer的愛恨情仇

    摘要:當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見對象的學(xué)習(xí) StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時并且也耗內(nèi)存(每次都會構(gòu)造一個新的string對象),而這種拼接操作又...

    stormjun 評論0 收藏0
  • java基礎(chǔ) 面試

    摘要:的區(qū)別是不可變的,如果嘗試去修改,會新生成一個字符串對象,和是可變的是線程安全的,是線程不安全的,所以在單線程環(huán)境下效率會更高和有哪些區(qū)別首先,他們的底層數(shù)據(jù)結(jié)構(gòu)不同,底層是基于數(shù)組實現(xiàn)的,底層是基于鏈表實現(xiàn)的由于底層 ...

    cc17 評論0 收藏0
  • 最最最常見的Java面試總結(jié)——第二周

    摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別 可變性...

    yearsj 評論0 收藏0

發(fā)表評論

0條評論

zhoutk

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<