亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言:

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

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

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

如何保證不可變

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

通過(guò)源碼可以看出來(lái)String是如何保證不可變的:

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

string類為不可變對(duì)象的好處

字符串常量池的需要:

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

線程安全的考慮:

在并發(fā)場(chǎng)景下,多個(gè)線程同時(shí)讀一個(gè)資源,不會(huì)引發(fā)競(jìng)爭(zhēng),但是同時(shí)寫(xiě)操作會(huì)引發(fā)競(jìng)爭(zhēng),string的不可變特點(diǎn),所以線程安全的。

支持hash緩存:

因?yàn)樽址遣豢勺兊模詣?chuàng)建的時(shí)候hash被緩存下來(lái)了,不需要重新計(jì)算,使得字符串很適合做Map的鍵,處理速度要快過(guò)其他的對(duì)象。

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

相關(guān)文章

  • java遞歸實(shí)現(xiàn)科赫雪花

    java遞歸實(shí)現(xiàn)科赫雪花

    這篇文章主要為大家詳細(xì)介紹了java遞歸實(shí)現(xiàn)科赫雪花,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java 多線程并發(fā)AbstractQueuedSynchronizer詳情

    Java 多線程并發(fā)AbstractQueuedSynchronizer詳情

    這篇文章主要介紹了Java 多線程并發(fā)AbstractQueuedSynchronizer詳情,文章圍繞主題展開(kāi)想象的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • java如何在應(yīng)用代碼里捕獲線程堆棧

    java如何在應(yīng)用代碼里捕獲線程堆棧

    這篇文章主要為大家介紹了java如何在應(yīng)用代碼里捕獲線程堆棧實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java中靜態(tài)代理的使用與原理詳解

    Java中靜態(tài)代理的使用與原理詳解

    這篇文章主要介紹了Java中靜態(tài)代理的使用與原理詳解,代理模式是為一個(gè)對(duì)象提供一個(gè)替身,以控制對(duì)這個(gè)對(duì)象的訪問(wèn),即通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能,需要的朋友可以參考下
    2023-09-09
  • springboot如何使用redis的incr創(chuàng)建分布式自增id

    springboot如何使用redis的incr創(chuàng)建分布式自增id

    這篇文章主要介紹了springboot如何使用redis的incr創(chuàng)建分布式自增id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • springboot使用小工具之Lombok、devtools、Spring Initailizr詳解

    springboot使用小工具之Lombok、devtools、Spring Initailizr詳解

    這篇文章主要介紹了springboot使用小工具之Lombok、devtools、Spring Initailizr詳解,Lombok可以代替手寫(xiě)get、set、構(gòu)造方法等,需要idea裝插件lombok,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • java中面向?qū)ο蟮母拍罴爸R(shí)點(diǎn)總結(jié)

    java中面向?qū)ο蟮母拍罴爸R(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于java中面向?qū)ο蟮母拍罴爸R(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以參考下。
    2021-01-01
  • 解決Spring?Boot應(yīng)用打包后文件訪問(wèn)問(wèn)題

    解決Spring?Boot應(yīng)用打包后文件訪問(wèn)問(wèn)題

    在Spring Boot項(xiàng)目的開(kāi)發(fā)過(guò)程中,一個(gè)常見(jiàn)的挑戰(zhàn)是如何有效地訪問(wèn)和操作資源文件,本文就來(lái)介紹一下解決Spring?Boot應(yīng)用打包后文件訪問(wèn)問(wèn)題,感興趣的可以了解一下
    2024-01-01
  • JAVA比較兩張圖片相似度的方法

    JAVA比較兩張圖片相似度的方法

    這篇文章主要介紹了JAVA比較兩張圖片相似度的方法,涉及java針對(duì)圖片像素操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Spring3 整合MyBatis3 配置多數(shù)據(jù)源動(dòng)態(tài)選擇SqlSessionFactory詳細(xì)教程

    Spring3 整合MyBatis3 配置多數(shù)據(jù)源動(dòng)態(tài)選擇SqlSessionFactory詳細(xì)教程

    這篇文章主要介紹了Spring3 整合MyBatis3 配置多數(shù)據(jù)源動(dòng)態(tài)選擇SqlSessionFactory詳細(xì)教程,需要的朋友可以參考下
    2017-04-04

最新評(píng)論