最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中String和StringBuffer及StringBuilder?有什么區(qū)別

 更新時間:2022年06月15日 08:49:19   作者:??共飲一杯無????  
這篇文章主要介紹了Java中String和StringBuffer及StringBuilder?有什么區(qū)別,String?是?Java?語言非?;A(chǔ)和重要的類,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容

前言:

String 是 Java 語言非?;A(chǔ)和重要的類,提供了構(gòu)造和管理字符串的各種基本邏輯。它是典型的 Immutable 類,被聲明成為 final class,所有屬性也都是 final 的。也由于它的不可變性,類似拼接、裁剪字符串等動作,都會產(chǎn)生新的 String 對象。由于字符串操作的普遍性,所以相關(guān)操作的效率往往對應(yīng)用性能有明顯影響。 StringBuffer 是為解決上面提到拼接產(chǎn)生太多中間對象的問題而提供的一個類,我們可以用 append 或者 add 方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer 本質(zhì)是一個線程安全的可修改字符序列,它保證了線程安全,也隨之帶來了額外的性能開銷,所以除非有線程安全的需要,不然還是推薦使用它的后繼者,也就是 StringBuilder。 StringBuilder 是 Java 1.5 中新增的,在能力上和 StringBuffer 沒有本質(zhì)區(qū)別,但是它去掉了線程安全的部分,有效減小了開銷,是絕大部分情況下進(jìn)行字符串拼接的首選。

String類為什么是immutable(不可變的)

不可變類指的是對象一旦創(chuàng)建成功,就無法改變對象的值。JDK中很多類設(shè)計為不可變的Integer,Long和String等。相對應(yīng)的改法中大多是可變類,創(chuàng)建成功后可以動態(tài)修改成員變量的屬性值;

如何保證不可變

  • 類添加final修飾符,保證類是不可以被繼承的;類繼承會破壞類的不可變機(jī)制,只要覆蓋父類的成員方法,并且在里面修改成員變量的值,那么所有子類以父類的形式出現(xiàn)的地方,類的屬性都會被修改掉
  • 類成員屬性設(shè)置為private,final的;這樣可以保證成員屬性是不可變的,但是僅僅這樣還不夠,因為如果成員變量是引用對象的話,可以改變引用對象的成員變量;通過第四點(diǎn)可以避免這一點(diǎn);
  • 不提供修改成員變量的方法,比如setter;
  • 通過構(gòu)造器構(gòu)造對象,并進(jìn)行深拷貝;如果是直接通過引用傳入的對象直接賦值給成員,還是可以通過修改外部引用變量導(dǎo)致改變內(nèi)部變量的值;

String的源碼如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
    /**
     * Class String is special cased within the Serialization Stream Protocol.
     *
     * A String instance is written into an ObjectOutputStream according to
     * <a href="{@docRoot}/../platform/serialization/spec/output.html" rel="external nofollow" >
     * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
     */
    private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];
    /**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
        this.value = "".value;
    }
    /**
     * Initializes a newly created {@code String} object so that it represents
     * the same sequence of characters as the argument; in other words, the
     * newly created string is a copy of the argument string. Unless an
     * explicit copy of {@code original} is needed, use of this constructor is
     * unnecessary since Strings are immutable.
     *
     * @param  original
     *         A {@code String}
     */
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

    /**
     * Allocates a new {@code String} so that it represents the sequence of
     * characters currently contained in the character array argument. The
     * contents of the character array are copied; subsequent modification of
     * the character array does not affect the newly created string.
     *
     * @param  value
     *         The initial value of the string
     */
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

通過源碼可以看出來String是如何保證不可變的:

  • String類是finaly的,不允許繼承
  • 成員變量value是private,final的
  • value沒有setter方法
  • 構(gòu)造方法,是通過克隆的方式來構(gòu)造的
  • 返回value時,通過克隆的方式返回

string類為不可變對象的好處

字符串常量池的需要:

String aaa= "someString"; String bbb = "someString"; 這兩個對象指向同一個內(nèi)存,字符串常量池的好處是,在大量使用字符串的時候,可以節(jié)省內(nèi)存,提供效率;如果String是可變對象,那么修改了一個,其他引用的地方全部發(fā)生變化了。

線程安全的考慮:

在并發(fā)場景下,多個線程同時讀一個資源,不會引發(fā)競爭,但是同時寫操作會引發(fā)競爭,string的不可變特點(diǎn),所以線程安全的。

支持hash緩存:

因為字符串是不可變的,所以創(chuàng)建的時候hash被緩存下來了,不需要重新計算,使得字符串很適合做Map的鍵,處理速度要快過其他的對象。

到此這篇關(guān)于Java中String和StringBuffer及StringBuilder 有什么區(qū)別的文章就介紹到這了,更多相關(guān)Java String 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Redis的步驟

    SpringBoot整合Redis的步驟

    這篇文章主要介紹了SpringBoot整合Redis的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • Java實(shí)現(xiàn)通過IP計算分析歸屬地實(shí)例分享

    Java實(shí)現(xiàn)通過IP計算分析歸屬地實(shí)例分享

    文章介紹了如何通過IP地址進(jìn)行歸屬地分析,包括IP地址的兩種類型(IPV4和IPV6)以及計算歸屬地的方法,對于不精準(zhǔn)的需求,推薦使用開源的字典庫如GeoIP2;對于高精度需求,可以購買專業(yè)的IP網(wǎng)段數(shù)據(jù)并實(shí)時更新數(shù)據(jù)庫,在設(shè)計項目時應(yīng)提前規(guī)劃數(shù)據(jù)結(jié)構(gòu),以避免數(shù)據(jù)清洗問題
    2025-05-05
  • Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)

    Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包)

    這篇文章主要介紹了Maven如何構(gòu)建可執(zhí)行的jar包(包含依賴jar包) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 淺析Java方法傳值和傳引用問題

    淺析Java方法傳值和傳引用問題

    這篇文章主要是對Java方法傳值和傳引用問題進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • Java完美實(shí)現(xiàn)2048小游戲

    Java完美實(shí)現(xiàn)2048小游戲

    本文給大家分享的是一則根據(jù)網(wǎng)友的代碼改編的2048小游戲的源碼,個人認(rèn)為已經(jīng)非常完美了,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • eclipse下配置Spring環(huán)境的方法步驟

    eclipse下配置Spring環(huán)境的方法步驟

    這篇文章主要介紹了eclipse下配置Spring環(huán)境的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例

    SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例

    這篇文章主要介紹了SpringBoot中如何添加監(jiān)聽器及創(chuàng)建線程,文中有詳細(xì)的代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • 解決springboot啟動成功,但訪問404的問題

    解決springboot啟動成功,但訪問404的問題

    這篇文章主要介紹了解決springboot啟動成功,但訪問404的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 淺談Storm在zookeeper上的目錄結(jié)構(gòu)

    淺談Storm在zookeeper上的目錄結(jié)構(gòu)

    這篇文章主要介紹了淺談Storm在zookeeper上的目錄結(jié)構(gòu)的相關(guān)內(nèi)容,涉及storm使用zookeeper的操作以及詳細(xì)結(jié)構(gòu)圖,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • MyBatis自定義攔截器實(shí)現(xiàn)優(yōu)化SQL日志輸出

    MyBatis自定義攔截器實(shí)現(xiàn)優(yōu)化SQL日志輸出

    這篇文章主要介紹了優(yōu)化MyBatisPlus SQL日志輸出的方案,針對默認(rèn)日志格式存在的不足,例如缺少時間、可讀性差、存儲成本高等,希望對大家有所幫助
    2026-03-03

最新評論

忻城县| 鲁山县| 齐河县| 台安县| 太仆寺旗| 札达县| 霍林郭勒市| 咸阳市| 龙胜| 绥滨县| 政和县| 兴隆县| 长治市| 桂阳县| 潜山县| 政和县| 金寨县| 枣庄市| 安仁县| 遵义县| 句容市| 北碚区| 周宁县| 宿迁市| 波密县| 隆子县| 伊春市| 康平县| 同心县| 鄢陵县| 马关县| 红河县| 潼南县| 临安市| 岳阳市| 潜山县| 富川| 桃园市| 仙桃市| 乐山市| 玉树县|