深入分析Java的String類的方法與特點
字元串是任何編程語言都必須支持的變數類型,有些編程語言是直接提供了原生的變數類型,有些編程語言則使用語法特性以 SDK 的形式提供支持。在Java編程平台中,對字元串的支持使用了後者的形式,就是通過在 JDK中提供一個名為String的類,對應字元串這個變數類型。
源碼分析
既然JDK中的String類對應了字元串變數類型,為了熟練地掌握Java中字元串相關的技能,我們必須深入地分析和研究一下這個類。編碼界有一句名言叫做 「源碼面前,了無秘密」,因此,我們第一步就是來看看String類的源碼概括。重點部分摘錄如下:
public final class String implements java.io.Serializable, Comparable
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
…
}
我們得出的幾個重點是:
String類的底層使用 char 的數組保存數據。
String類是一個 final 類,不允許被繼承。
String類是一個 immutable 類,該類的對象生成後,內容不會發生變化。該類中的所有返回String類型對象的成員方法都是返回一個新的String對象。
JVM內存模型
Java作為一門半編譯半解釋或者即編譯又解釋的編程語言,Java源碼文件需要先被編譯器編譯成 ByteCode(位元組碼) 文件,然後在 JVM(Java虛擬機) 上解釋執行。為了理解和掌握String類的特性,必須清楚地知道JVM的內存模型。對於字元串類型,也就是String類,JVM從編譯源碼到執行位元組碼的整個過程中,都做了特定的調整與優化,正是這些調整與優化造成了String類與對象的一些詭異特性。
關於JVM內存模型的分析與理解,可以參看我的另一篇文件或者通過其他的書籍與資料學習。與本文內容緊密相關的兩個知識點總結如下:
JVM的內存模型中有一塊區域名為 方法區, 用於存儲載入的類信息、方法體和各種符號表。
方法區中有一塊區域名為 常量區, 用於存儲編譯時和運行時的字元串常量。
方法剖析
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與==
對於 ==,如果作用與基本數據類型(byte、short、char、int、long、float、double、boolean)的變數,則比較的是其存儲的「值」是否相等;如果作用與引用類型的變數,則比較其所指向的對象的地址是否相同(即是否同一個對象)。在Java中,String是引用類型。
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中的內存布局簡圖如下:
對照此圖,答案就很清楚了。
編譯優化
直接來看代碼片段二:
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類的重點和難點。特別是其中的不可變特性與編譯優化特性,更是在實際項目中和筆試面試題中經常遇到,還有就是intern方法的詭異性。當然了,String的這些特性也不是完美的,不可變特性在大量拼接字元串時就會帶來性能的極大損耗,所以需要使用StringBuilder 類或者 StringBuffer 類來代替。另外,本文對於String類中的方法的具體功能與注意點都沒有仔細分析,但需要讀者熟練掌握,無論對於筆試面試還是實際工作都大有裨益。
學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學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的設計特點