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

一文帶你深入了解Java?String的不可變性

 更新時間:2023年06月26日 10:12:45   作者:東方甲乙木土  
這篇文章主要來和大家一起深入探討一下Java?String中的不可變性,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

String 類

String 類結(jié)構(gòu)

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
        // ...
    }

Java String 類是 java.lang 包中的類,其實現(xiàn)了 java.io.Serializable, Comparable, CharSequence 等接口。

String 類對象中存儲的字符串,最終都是以字符形式存儲在其 char[] 數(shù)組中,獲取時從數(shù)組中讀取字符列表,且 String 中該屬性使用了 final 關(guān)鍵字定義。

private final char value[];

除此之外,String 類在 Object 的基礎(chǔ)上重寫了 equals() 和 hashCode() 方法,

  • equals() 除了使用 == 判斷相等外,還會遍歷循環(huán)比較兩個字符串對應(yīng)字符串?dāng)?shù)組中的每個字符,如果完全相同也會認(rèn)為字符串相等。
  • toString() 方法直接返回字符串本身,因為其就是字符串,無需 toString 轉(zhuǎn)換
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

String 的不可變性怎么理解

Java 中 String 類是不可變的,這意味著一旦創(chuàng)建了一個 String 對象,就不能再修改它的值。

String str = "abc";
str = "123";
System.out.println(str); // 輸出 123
  • 上述代碼看似是改變了字符串內(nèi)容,但是實際上只是將變量 str 指向的地址由 "abc" 改成了 "123",在字符串常量池中 "abc" 仍然存在,不被改變。
  • 對于 String 提供的 trim()、replace() 等修改字符串字面值的方法也是同理,都是重新創(chuàng)建一個字符串返回,并沒有修改原始字符串。

String 類的不可變性體現(xiàn)在如下方面:

1.String 類使用 final 修飾,保證該類不會被繼承進(jìn)行修改

2.String 類中存儲內(nèi)容的 char [] 使用 final 修飾,保證字符數(shù)組引用不會被修改

3.盡管 String 類的 char[] 中的元素仍可以修改,但是又通過如下兩種方式控制不被修改

  • char[] 定義為 private ,即不可以從外部進(jìn)行操作
  • String 類中所有內(nèi)部方法都避免操作 char[] 內(nèi)容

基于上述內(nèi)容,保證了 String 的 char[] 內(nèi)容是不可變的,即 String 的不可變性。

由于 String 類是不可變的,所以它的性能比較高,且是線程安全的,即多個線程可以同時訪問同一個 String 對象,而不會出現(xiàn)線程問題。

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

String 類的常用方法都有那些

  • length():返回字符串長度
  • trim():去除字符串兩端空白。
  • toLowerCase():將字符串轉(zhuǎn)成小寫字母。
  • toUpperCase():將字符串轉(zhuǎn)成大寫字符。
  • charAt(int index):返回指定索引處的字符。
  • inexOf(char c):返回指定字符的索引。
  • replace():字符串替換。
  • split():分割字符串,返回一個分割后的字符串?dāng)?shù)組。
  • substring (int beginIndex, int endIndex):返回從 beginIndex 到 endIndex-1 的子字符串。
  • equals(Object obj):字符串比較是否相等。
  • getBytes():返回字符串的 byte 類型數(shù)組。

String 常用工具類

StringUtils 是處理字符串的工具類,String 類實現(xiàn) CharSequence 接口,為實現(xiàn)不同的 String 操作,各大廠商封裝了相應(yīng)的 StringUtils 工具類。

org.springframework.util.StringUtils,spring 自帶 String 工具類,可以滿足基本的使用。

Java Web 中不需要導(dǎo)包,在 spring-core 包中存在,可以直接使用

org.apache.commons.lang.StringUtils, apache 提供的 String 工具類,對 java.lang 的擴展。

lang 最新版本是 2.6,最低要求 Java1.2 以上,目前官方已不再維護(hù)。

apache-commons-lang3.StringUtils,lang 的升級包,將參數(shù)換成 CharSequence 數(shù)組,貼合 String 類型的內(nèi)部結(jié)構(gòu),最常用工具類包。

lang3 目前最新版本是 3.12.0,最低要求 Java8 以上。相對于 lang 來說完全支持 Java8 的特性,廢除了一些舊的 API。該版本無法兼容舊有版本,于是為了避免沖突改名為 lang3。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.6</version>
</dependency>

到此這篇關(guān)于一文帶你深入了解Java String的不可變性的文章就介紹到這了,更多相關(guān)String不可變性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot?Swagger3常用注解詳解與實戰(zhàn)指南

    Spring?Boot?Swagger3常用注解詳解與實戰(zhàn)指南

    Swagger是一個用于設(shè)計、構(gòu)建、文檔化和使用RESTful?Web服務(wù)的開源工具,Swagger3是Swagger的最新版本,它提供了許多新功能和改進(jìn),這篇文章主要介紹了Spring?Boot?Swagger3常用注解詳解與實戰(zhàn)指南的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • spring?mybatis環(huán)境常量與枚舉轉(zhuǎn)換示例詳解

    spring?mybatis環(huán)境常量與枚舉轉(zhuǎn)換示例詳解

    這篇文章主要為大家介紹了spring?mybatis環(huán)境常量與枚舉轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 超詳細(xì)講解SpringCloud?Commons公共抽象的用法

    超詳細(xì)講解SpringCloud?Commons公共抽象的用法

    這篇文章主要介紹了超詳細(xì)講解SpringCloud?Commons公共抽象的用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Spring中RedisTemplate使用方法詳解

    Spring中RedisTemplate使用方法詳解

    Spring封裝了一個比較強大的模板,也就是redisTemplate,方便在開發(fā)的時候操作Redis緩存,這篇文章主要給大家介紹了關(guān)于Java中RedisTemplate使用方法的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 劍指Offer之Java算法習(xí)題精講鏈表與字符串及數(shù)組

    劍指Offer之Java算法習(xí)題精講鏈表與字符串及數(shù)組

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Guava范圍類Range方法實例深入解析

    Guava范圍類Range方法實例深入解析

    這篇文章主要為大家介紹了Guava范圍類Range方法實例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 深入淺出講解Java中的枚舉類

    深入淺出講解Java中的枚舉類

    這篇文章主要介紹了深入淺出講解Java中的枚舉類,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Springboot常用方法參數(shù)注解示例詳解

    Springboot常用方法參數(shù)注解示例詳解

    這篇文章主要介紹了Springboot常用方法參數(shù)注解及示例,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Spring3整合MyBatis實現(xiàn)分頁查詢和搜索功能

    Spring3整合MyBatis實現(xiàn)分頁查詢和搜索功能

    本文詳細(xì)介紹了如何在SpringBoot和MyBatis框架下實現(xiàn)分頁查詢和搜索功能,結(jié)合Vue和ElementUI構(gòu)建前端界面,通過配置PageHelper插件,編寫動態(tài)SQL,封裝統(tǒng)一的請求工具,本文結(jié)合示例代碼講解的非常詳細(xì),感興趣的朋友一起看看吧
    2026-01-01
  • java.sql.Date和java.util.Date的區(qū)別詳解

    java.sql.Date和java.util.Date的區(qū)別詳解

    Java中有兩個Date類,一個是java.util.Date通常情況下用它獲取當(dāng)前時間或構(gòu)造時間,另一個是java.sql.Date是針對SQL語句使用的,它只包含日期而沒有時間部分,這篇文章主要給大家介紹了關(guān)于java.sql.Date和java.util.Date區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評論

瑞安市| 响水县| 新野县| 冷水江市| 手机| 大姚县| 汉寿县| 兴业县| 荔波县| 马边| 南澳县| 宜州市| 乌拉特后旗| 乌拉特前旗| 紫金县| 成安县| 烟台市| 周口市| 莱阳市| 依兰县| 永川市| 兴宁市| 关岭| 金寨县| 扎兰屯市| 和顺县| 德州市| 淄博市| 泰顺县| 玉门市| 房山区| 简阳市| 绥芬河市| 莆田市| 临沂市| 新河县| 酒泉市| 太仓市| 阳泉市| 宁晋县| 沁阳市|