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

Java 基礎(chǔ)面試真題:String 為什么是不可變的?

 更新時間:2025年01月27日 09:22:12   作者:思wu邪  
本文主要介紹了String、StringBuffer和StringBuilder的區(qū)別,以及String不可變的原因,String不可變的原因是其內(nèi)部使用final修飾的char數(shù)組保存字符串,同時String類沒有提供修改字符串的方法,在Java9之后,String的底層實現(xiàn)由char[]改成了byte[],這是為了節(jié)省內(nèi)存空間

今天來分享一道群友去阿里云面試遇到的 Java 基礎(chǔ)面試真題:“String、StringBuffer、StringBuilder 的區(qū)別?String 為什么是不可變的?”。

網(wǎng)站很多文章都把 String 不可變的原因講錯了,建議你重點(diǎn)關(guān)注一下。另外,本文還提到了 :“Java 9 為何要將 String 的底層實現(xiàn)由 char[] 改成了 byte[] ?”

下面是正文。

可變性

簡單的來說:String 類中使用 final 關(guān)鍵字修飾字符數(shù)組來保存字符串,所以String 對象是不可變的。×

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
 //...
}

?? 修正 :我們知道被 final 關(guān)鍵字修飾的類不能被繼承,修飾的方法不能被重寫,修飾的變量是基本數(shù)據(jù)類型則值不能改變,修飾的變量是引用類型則不能再指向其他對象。因此,final 關(guān)鍵字修飾的數(shù)組保存字符串并不是 String 不可變的根本原因,因為這個數(shù)組保存的字符串是可變的(final 修飾引用類型變量的情況)。

String 真正不可變有下面幾點(diǎn)原因:

保存字符串的數(shù)組被 final 修飾且為私有的,并且String 類沒有提供/暴露修改這個字符串的方法。

String 類被 final 修飾導(dǎo)致其不能被繼承,進(jìn)而避免了子類破壞 String 不可變。

相關(guān)閱讀:如何理解 String 類型值的不可變?- 知乎提問[1]

補(bǔ)充(來自issue 675[2]):在 Java 9 之后,StringStringBuilderStringBuffer 的實現(xiàn)改用 byte 數(shù)組存儲字符串。

Java 9 為何要將 String 的底層實現(xiàn)由 char[] 改成了 byte[] ?

新版的 String 其實支持兩個編碼方案:Latin-1 和 UTF-16。如果字符串中包含的漢字沒有超過 Latin-1 可表示范圍內(nèi)的字符,那就會使用 Latin-1 作為編碼方案。Latin-1 編碼方案下,byte 占一個字節(jié)(8 位),char 占用 2 個字節(jié)(16),byte 相較 char 節(jié)省一半的內(nèi)存空間。

如果字符串中包含的漢字超過 Latin-1 可表示范圍內(nèi)的字符,bytechar 所占用的空間是一樣的。

這是官方的介紹:https://openjdk.java.net/jeps/254 。

StringBuilderStringBuffer 都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數(shù)組保存字符串,不過沒有使用 finalprivate 關(guān)鍵字修飾,最關(guān)鍵的是這個 AbstractStringBuilder 類還提供了很多修改字符串的方法比如 append 方法。

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
   //...
}

線程安全性

String 中的對象是不可變的,也就可以理解為常量,線程安全。AbstractStringBuilderStringBuilderStringBuffer 的公共父類,定義了一些字符串的基本操作,如 expandCapacityappend、insert、indexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的。StringBuilder 并沒有對方法進(jìn)行加同步鎖,所以是非線程安全的。

性能

每次對 String 類型進(jìn)行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象。StringBuffer 每次都會對 StringBuffer 對象本身進(jìn)行操作,而不是生成新的對象并改變對象引用。相同情況下使用 StringBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風(fēng)險。

對于三者使用的總結(jié):

  • 操作少量的數(shù)據(jù): 適用 String
  • 單線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù): 適用 StringBuilder
  • 多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù): 適用 StringBuffer

到此這篇關(guān)于Java 基礎(chǔ)面試真題:String 為什么是不可變的?的文章就介紹到這了,更多相關(guān)String 為什么是不可變的?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb如何發(fā)送狀態(tài)碼方法解析

    JavaWeb如何發(fā)送狀態(tài)碼方法解析

    這篇文章主要介紹了JavaWeb如何發(fā)送狀態(tài)碼方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 簡單分析JDK中「SPI」的原理

    簡單分析JDK中「SPI」的原理

    文章介紹了Java SPI(Service Provider Interface)機(jī)制,包括其概念、入門案例、原理分析以及實際應(yīng)用,SPI機(jī)制通過服務(wù)接口和實現(xiàn)類的解耦,實現(xiàn)了服務(wù)的動態(tài)加載和擴(kuò)展,文章詳細(xì)解釋了SPI機(jī)制的工作原理,包括迭代、hasNextService和nextService方法的實現(xiàn)
    2025-05-05
  • 解決springboot項目啟動報錯Error creating bean with name dataSourceScriptDatabaseInitializer問題

    解決springboot項目啟動報錯Error creating bean with&nb

    這篇文章主要介紹了解決springboot項目啟動報錯Error creating bean with name dataSourceScriptDatabaseInitializer問題,具有很好的參考價值,希望對大家有所幫助
    2024-03-03
  • Java零基礎(chǔ)講解異常

    Java零基礎(chǔ)講解異常

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機(jī)制是我們java語言使用異常處理機(jī)制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-04-04
  • spring cloud 阿波羅 apollo 本地開發(fā)環(huán)境搭建過程

    spring cloud 阿波羅 apollo 本地開發(fā)環(huán)境搭建過程

    Apollo(阿波羅)是攜程框架部門研發(fā)的配置管理平臺,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性
    2018-01-01
  • 基于spring同名bean覆蓋問題的解決

    基于spring同名bean覆蓋問題的解決

    這篇文章主要介紹了spring同名bean覆蓋問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot?實現(xiàn)動態(tài)添加定時任務(wù)功能

    SpringBoot?實現(xiàn)動態(tài)添加定時任務(wù)功能

    這篇文章主要介紹了SpringBoot?動態(tài)添加定時任務(wù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • 解決IDEA創(chuàng)建SpringBoot項目沒有Java版本8問題

    解決IDEA創(chuàng)建SpringBoot項目沒有Java版本8問題

    這篇文章主要介紹了解決IDEA創(chuàng)建SpringBoot項目沒有Java版本8問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java實現(xiàn)聊天機(jī)器人完善版

    Java實現(xiàn)聊天機(jī)器人完善版

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)聊天機(jī)器人完善版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot內(nèi)置服務(wù)器(Tomcat/Jetty/Undertow)切換的操作指南

    SpringBoot內(nèi)置服務(wù)器(Tomcat/Jetty/Undertow)切換的操作指南

    本文介紹了如何在SpringBoot中切換內(nèi)置服務(wù)器(Tomcat、Jetty和Undertow),分析了它們的核心差異和適用場景,通過修改pom.xml和application.yml文件,可以實現(xiàn)服務(wù)器的切換和自定義配置,最后給出了選型建議和注意事項,需要的朋友可以參考下
    2026-03-03

最新評論

高台县| 长泰县| 新绛县| 莱芜市| 安国市| 沙田区| 梨树县| 区。| 康保县| 布尔津县| 贵溪市| 彩票| 涿州市| 会理县| 博罗县| 如东县| 通化县| 雷山县| 乾安县| 榕江县| 卓资县| 双桥区| 德江县| 文水县| 麻城市| 晋江市| 江安县| 饶阳县| 陆良县| 繁峙县| 永顺县| 富宁县| 阜新| 紫金县| 桦南县| 台湾省| 祁阳县| 阿尔山市| 平顶山市| 西丰县| 吉林市|