一文帶你深入了解Java?String的不可變性
String 類
String 類結(jié)構(gòu)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // ... }
Java String 類是 java.lang 包中的類,其實(shí)現(xiàn)了 java.io.Serializable, Comparable, CharSequence 等接口。
String 類對(duì)象中存儲(chǔ)的字符串,最終都是以字符形式存儲(chǔ)在其 char[] 數(shù)組中,獲取時(shí)從數(shù)組中讀取字符列表,且 String 中該屬性使用了 final 關(guān)鍵字定義。
private final char value[];
除此之外,String 類在 Object 的基礎(chǔ)上重寫(xiě)了 equals() 和 hashCode() 方法,
- equals() 除了使用 == 判斷相等外,還會(huì)遍歷循環(huán)比較兩個(gè)字符串對(duì)應(yīng)字符串?dāng)?shù)組中的每個(gè)字符,如果完全相同也會(huì)認(rèn)為字符串相等。
- toString() 方法直接返回字符串本身,因?yàn)槠渚褪亲址?,無(wú)需 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)建了一個(gè) String 對(duì)象,就不能再修改它的值。
String str = "abc"; str = "123"; System.out.println(str); // 輸出 123
- 上述代碼看似是改變了字符串內(nèi)容,但是實(shí)際上只是將變量 str 指向的地址由 "abc" 改成了 "123",在字符串常量池中 "abc" 仍然存在,不被改變。
- 對(duì)于 String 提供的 trim()、replace() 等修改字符串字面值的方法也是同理,都是重新創(chuàng)建一個(gè)字符串返回,并沒(méi)有修改原始字符串。
String 類的不可變性體現(xiàn)在如下方面:
1.String 類使用 final 修飾,保證該類不會(huì)被繼承進(jìn)行修改
2.String 類中存儲(chǔ)內(nèi)容的 char [] 使用 final 修飾,保證字符數(shù)組引用不會(huì)被修改
3.盡管 String 類的 char[] 中的元素仍可以修改,但是又通過(guò)如下兩種方式控制不被修改
- char[] 定義為 private ,即不可以從外部進(jìn)行操作
- String 類中所有內(nèi)部方法都避免操作 char[] 內(nèi)容
基于上述內(nèi)容,保證了 String 的 char[] 內(nèi)容是不可變的,即 String 的不可變性。
由于 String 類是不可變的,所以它的性能比較高,且是線程安全的,即多個(gè)線程可以同時(shí)訪問(wèn)同一個(gè) String 對(duì)象,而不會(huì)出現(xiàn)線程問(wè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():返回字符串長(zhǎng)度
- trim():去除字符串兩端空白。
- toLowerCase():將字符串轉(zhuǎn)成小寫(xiě)字母。
- toUpperCase():將字符串轉(zhuǎn)成大寫(xiě)字符。
- charAt(int index):返回指定索引處的字符。
- inexOf(char c):返回指定字符的索引。
- replace():字符串替換。
- split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。
- substring (int beginIndex, int endIndex):返回從 beginIndex 到 endIndex-1 的子字符串。
- equals(Object obj):字符串比較是否相等。
- getBytes():返回字符串的 byte 類型數(shù)組。
String 常用工具類
StringUtils 是處理字符串的工具類,String 類實(shí)現(xiàn) CharSequence 接口,為實(shí)現(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 工具類,對(duì) java.lang 的擴(kuò)展。
lang 最新版本是 2.6,最低要求 Java1.2 以上,目前官方已不再維護(hù)。
apache-commons-lang3.StringUtils
,lang 的升級(jí)包,將參數(shù)換成 CharSequence 數(shù)組,貼合 String 類型的內(nèi)部結(jié)構(gòu),最常用工具類包。
lang3 目前最新版本是 3.12.0,最低要求 Java8 以上。相對(duì)于 lang 來(lái)說(shuō)完全支持 Java8 的特性,廢除了一些舊的 API。該版本無(wú)法兼容舊有版本,于是為了避免沖突改名為 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法
這篇文章主要介紹了IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04淺析java程序中hibernate的應(yīng)用總結(jié)
hibernate可以理解為是一個(gè)中間件它負(fù)責(zé)把java程序的sql語(yǔ)句接收過(guò)來(lái)發(fā)送到數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)返回來(lái)的信息hibernate接收之后直接生成一個(gè)對(duì)象傳給java2013-07-07Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例
這篇文章主要介紹了Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化
這篇文章主要介紹了Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化,快速排序算法的最差時(shí)間復(fù)雜度為(n^2),最優(yōu)時(shí)間復(fù)雜度為(n\log n),存在優(yōu)化的空間,需要的朋友可以參考下2016-05-05