當前位置:
首頁 > 知識 > 深入分析Java的String類的方法與特點

深入分析Java的String類的方法與特點

字元串是任何編程語言都必須支持的變數類型,有些編程語言是直接提供了原生的變數類型,有些編程語言則使用語法特性以 SDK 的形式提供支持。在Java編程平台中,對字元串的支持使用了後者的形式,就是通過在 JDK中提供一個名為String的類,對應字元串這個變數類型。

源碼分析

既然JDK中的String類對應了字元串變數類型,為了熟練地掌握Java中字元串相關的技能,我們必須深入地分析和研究一下這個類。編碼界有一句名言叫做 「源碼面前,了無秘密」,因此,我們第一步就是來看看String類的源碼概括。重點部分摘錄如下:

public final class String implements java.io.Serializable, Comparable, 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

}

我們得出的幾個重點是:

  1. String類的底層使用 char 的數組保存數據。

  2. String類是一個 final 類,不允許被繼承。

  3. String類是一個 immutable 類,該類的對象生成後,內容不會發生變化。該類中的所有返回String類型對象的成員方法都是返回一個新的String對象

JVM內存模型

Java作為一門半編譯半解釋或者即編譯又解釋的編程語言,Java源碼文件需要先被編譯器編譯成 ByteCode(位元組碼) 文件,然後在 JVM(Java虛擬機) 上解釋執行。為了理解和掌握String類的特性,必須清楚地知道JVM的內存模型。對於字元串類型,也就是String類,JVM從編譯源碼到執行位元組碼的整個過程中,都做了特定的調整與優化,正是這些調整與優化造成了String類與對象的一些詭異特性。

關於JVM內存模型的分析與理解,可以參看我的另一篇文件或者通過其他的書籍與資料學習。與本文內容緊密相關的兩個知識點總結如下:

  1. JVM的內存模型中有一塊區域名為 方法區, 用於存儲載入的類信息、方法體和各種符號表。

  2. 方法區中有一塊區域名為 常量區, 用於存儲編譯時和運行時的字元串常量。

方法剖析

String類作為對應字元串的類,該類中含有大量的方法用來完成字元串相關的構造、裁剪、拼接與替換等功能。具體而言,在 JDK8 時,該類中已經有多於80個方法,好在其中有大部分都是重載方法。我們應該按照他們的功能把他們分類如下:


方法名 功能 方法名 功能
String 構造 codePoint* 取值
length 長度 getChars 取值
isEmpty 判空 getBytes 取值
charAt 取值 *equals* 判等
compareTo* 比較 regionMatches 正則
startWith 判斷 *indexOf 取值
substring 截取 concat 拼接
replace* 替換 matches 正則
contains 包含 split 分割
join 拼接 to* 轉換
trim 去空格 format 格式化
*valueOf 轉換 intern 獲取

特性剖析

由於字元串類型的特殊性和頻繁性,出於功能和效率的考慮,Java在處理字元串類型時,提供了幾個重要的特性。

equals與==

  1. 對於 ==,如果作用與基本數據類型(byte、short、char、int、long、float、double、boolean)的變數,則比較的是其存儲的「值」是否相等;如果作用與引用類型的變數,則比較其所指向的對象的地址是否相同(即是否同一個對象)。在Java中,String是引用類型。

  2. String的 equals 方法繼承自Java中的超級父類Object,Object的equals方法用來比較兩個對象的引用是否相等(即是否同一個對象)。但是,String的equals方法不僅是簡單地繼承,而是進行了重寫(Override),用來比較兩個String對象所存儲的字元序列值是否相等。

創建方式

對於Java中的類而言,創建對象的方式一般有 5種。它們分別是 new 關鍵字、Class類的 newInstance 方法、Constructor類的 newInstance 方法、String對象的 clone方法、反序列化機制。但是String對象還有一種特殊的創建方式,就是通過使用 「 或 』 包裹字元序列。現在,我們重點關注一下 new關鍵字字元序列 這兩種創建String對象的方式的異同。

我們直接以代碼實例的方式來學習兩種方式的優缺點。首先看代碼片段一:

String strA = 「www.tiantianbianma.com」;

String strB = new String(「www.tiantianbianma.com」);

String strC = new String(「www.tiantianbianma.com」);

System.out.println(strA.equals(strB));

System.out.println(strA == strB);

System.out.println(strA.equals(strC));

System.out.println(strA == strC);

System.out.println(strB.equal(strC));

System.out.println(strB == strC);

建議思考得出答案後,再上機驗證結果。正確的答案是 true、false、true、false、true、false。他們在JVM中的內存布局簡圖如下:

深入分析Java的String類的方法與特點

對照此圖,答案就很清楚了。

編譯優化

直接來看代碼片段二:

final String str = 「ma.com」;

String strA = 「www.tiantianbianma.com」;

String strB = 「wwww.tiantian」 + 「bianma.com」;

String strC = 「www.tiantianbian」 + str;

System.out.println(strA.equals(strB));

System.out.println(strA == strB);

System.out.println(strA.equals(strC));

System.out.println(strA == strC);

建議思考得出答案後,再上機驗證結果。正確的答案是 true、true、true、true,希望沒有出乎你的意料。背後的邏輯是Java編譯器在編譯源碼時,對於編譯時就可以確定的字元常量,包括字元序列和final字元變數,會自動進行拼接優化。

intern方法

String類中最詭異的一個方法就是 intern,還是先來看代碼片段三:

String strA = 「www.tiantianbianma.com」;

String strB = new String(「www.tiantianbianma.com」);

System.out.println(strA.intern().equals(strB.intern()));

System.out.println(strA.intern() == strB.intern());

建議思考得出答案後,再上機驗證結果。正確的答案是 true、true。背後的原理是:無論是字元串常量區中的String對象,還是堆內存中的String對象,它們的intern方法都是去JVM中的字元串常量區獲取相等字元序列的String對象返回。上述代碼片段的JVM內存布局簡圖如下:

深入分析Java的String類的方法與特點

對照此圖,答案就很清楚了。

總結

本文通過從源碼入手,再到方法和特性的分析,基本上覆蓋了Java中String類的重點和難點。特別是其中的不可變特性與編譯優化特性,更是在實際項目中和筆試面試題中經常遇到,還有就是intern方法的詭異性。當然了,String的這些特性也不是完美的,不可變特性在大量拼接字元串時就會帶來性能的極大損耗,所以需要使用StringBuilder 類或者 StringBuffer 類來代替。另外,本文對於String類中的方法的具體功能與注意點都沒有仔細分析,但需要讀者熟練掌握,無論對於筆試面試還是實際工作都大有裨益。


學習Java的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java團長 的精彩文章:

Java對於內存的需要知道的知識
Java反射與代理
Java編程科普書籍推薦
從零開始理解Java事件處理機制
人人網面試經歷

TAG:Java團長 |

您可能感興趣

iPhone SE2概念機:融合了iPhone SE和iPhone X的設計特點
SteelSeries Arctis Pro旗艦耳機針對遊戲的特點進行了調整
官窯Official kilns的特點—價值
關於session與cookie特點總結
Julien Macdonald時裝系列設計師利用非洲特點的元素和時尚相結合
NIKE ZOOM和Adidas boost各有什麼特點?
什麼是Cybersource?Cybersource有什麼特點?
Magic Leap One拆機報告:圖文一覽其設備細節與技術特點
即將到來的 Debian 10 Buster 發布版的新特點
Steel Circus好玩嗎 遊戲背景特點介紹
蘋果新一代iPad、iPhone SE曝光 一個特點:便宜
DOTA2衍生卡牌遊戲《Artifact》上架Steam平台,看下都有哪些特點
新SAT考試有哪些特點?聽聽College Board怎麼說
Billboard充分表現出了歌手鍾鉉的特點好評
微軟Chrome版Edge瀏覽器曝光:有3個特點
python入門學習應該了解的特性特點
三星發布 Galaxy J2 Pro 手機,最大的特點是根本上不了網!
新iphone X四大特點全面曝光,未滿1歲的iphone X可能就要死了
Nova5pro和榮耀20 pro誰更好?性能相近,各有特點
概念iPhone 5X曝光:完美融合了5s和X的設計特點