來源:拉勾教育Java就業(yè)集訓營
String類的概念
java.lang.String類用于描述字符串,Java程序中所有的字符串字面值都可以使用該類的對象加以描 述,如:"abc"。
該類由final關鍵字修飾,表示該類不能被繼承。
從jdk1.9開始該類的底層不使用char[]來存儲數(shù)據(jù),而是改成 byte[]加上編碼標記,從而節(jié)約了一 些空間。
該類描述的字符串內(nèi)容是個常量不可更改,因此可以被共享使用。
-
如: String str1 = “abc”; - 其中"abc"這個字符串是個常量不可改變。 str1 = “123”; - 將“123”字符串的地址賦值給變量str1。 - 改變str1的指向并沒有改變指向的內(nèi)容 ,"abc"如果沒有被引用,會被垃圾回收機制回收
01 String類型引用的指向改變.png
public static void main(String[] args) {
String s1="abc";
String s2="abc";
System.out.println(s1==s2); //true 比較地址 abc存在常量池
}
常量池的概念
由于String類型描述的字符串內(nèi)容是常量不可改變,因此Java虛擬機將首次出現(xiàn)的字符串放入常量 池中,若后續(xù)代碼中出現(xiàn)了相同字符串內(nèi)容則直接使用池中已有的字符串對象而無需申請內(nèi)存及創(chuàng)建對 象,從而提高了性能。
常用的構造方法
| 方法聲明 | 功能介紹 |
|---|---|
| String() | 使用無參方式構造對象得到空字符序列 ,“” 表示空字符串 |
| String(byte[] bytes, int offset, int length) | 使用bytes數(shù)組中下標從offset位置開始的length個字節(jié)來 構造對象 |
| String(byte[] bytes) | 使用bytes數(shù)組中的所有內(nèi)容構造對象 |
| String(char[] value, int offset, int count) | 使用value數(shù)組中下標從offset位置開始的count個字符來構 造對象 |
| String(char[] value) | 使用value數(shù)組中的所有內(nèi)容構造對象 |
| String(String original) | 根據(jù)參數(shù)指定的字符串內(nèi)容來構造對象,新創(chuàng)建對象為參數(shù)對象的副本 |
public static void main(String[] args) {
//下面代碼會創(chuàng)建幾個對象,分別存放在哪里
String s1="abc"; // 1個對象 存在常量池
String s2=new String("abc"); //2個對象 "abc"在常量池 new的對象在堆區(qū)(堆區(qū)存abc的副本) s2指向堆區(qū)
String s3="hello";
String s4="hello";
String s5=new String("hello");
String s6=new String("hello");
System.out.println(s3==s4); //true
System.out.println(s3.equals(s4)); //true
System.out.println(s5==s6); //false
System.out.println(s5.equals(s6)); //true
System.out.println(s3==s5); //false
System.out.println(s3.equals(s5)); //true
//常量由優(yōu)化機制,變量沒有
String a1="abcd";
String a2="ab"+"cd"; // 常量優(yōu)化機制 "abcd"
System.out.println(a1==a2);//比較地址 true
String a3="ab";
String a4=a3+"cd"; //沒有優(yōu)化機制
System.out.println(a3==a4);//比較地址 false
}
常用的成員方法
| 方法聲明 | 功能介紹 |
|---|---|
| String toString() | 返回字符串本身,重寫Object toString()方法 |
| byte[] getBytes() | 將當前字符串內(nèi)容轉換為byte數(shù)組并返回,先將字符串拆分為字符,再將字符轉byte |
| char[] toCharArray() | 用于將當前字符串內(nèi)容轉換為char數(shù)組并返回 |
| char charAt(int index) | 方法charAt用于返回字符串指定位置的字符。 |
| int length() | 返回字符串字符序列的長度 |
| boolean isEmpty() | 判斷字符串是否為空 |
| int compareTo(String anotherString) | 用于比較調(diào)用對象和參數(shù)對象的大小關系 |
| int compareToIgnoreCase(String str) | 不考慮大小寫,也就是'a'和'A'是相等的關系 |
| String concat(String str) | 用于實現(xiàn)字符串的拼接 |
| boolean contains(CharSequence s) | 用于判斷當前字符串是否包含參數(shù)指定的內(nèi)容,String實現(xiàn)類CharSequence接口 |
| String toLowerCase() | 返回字符串的小寫形式 //常量 轉換后不會改變原值 |
| String toUpperCase() | 返回字符串的大寫形式 |
| String trim() | 返回去掉前導和后繼空白的字符串 |
| boolean startsWith(String prefix) | 判斷字符串是否以參數(shù)字符串開頭 |
| boolean startsWith(String prefix, int toffset) | 從指定位置開始是否以參數(shù)字符串開頭 |
| boolean endsWith(String suffix) | 判斷字符串是否以參數(shù)字符串結尾 |
| boolean equals(Object anObject) | 用于比較字符串內(nèi)容是否相等并返回 |
| int hashCode() | 獲取調(diào)用對象的哈希碼值 |
| boolean equalsIgnoreCase(String anotherString) | 用于比較字符串內(nèi)容是否相等并返回,不考慮大小寫, 如:'A'和'a'是相等 |
| int indexOf(int ch) | 用于返回當前字符串中參數(shù)ch指定的字符第一次出現(xiàn)的 下標 |
| int indexOf(int ch, int fromIndex) | 用于從fromIndex位置開始查找ch指定的字符 |
| int indexOf(String str) | 在字符串中檢索str返回其第一次出現(xiàn)的位置,若找不到 返回-1,正向查找 |
| int indexOf(String str, int fromIndex) | 表示從字符串的fromIndex位置開始檢索str第一次出現(xiàn) 的位置 |
| int lastIndexOf(int ch) | 用于返回參數(shù)ch指定的字符最后一次出現(xiàn)的下標 |
| int lastIndexOf(int ch, int fromIndex) | 用于從fromIndex位置開始查找ch指定字符出現(xiàn)的下標 |
| int lastIndexOf(String str) | 返回str指定字符串最后一次出現(xiàn)的下標 ,反向查找 |
| int lastIndexOf(String str, int fromIndex) | 用于從fromIndex位置開始反向搜索的第一次出現(xiàn)的下 標。 |
| String substring(int beginIndex, int endIndex) | 返回字符串中從下標beginIndex(包括)開始到 endIndex(不包括)結束的子字符串 |
| String substring(int beginIndex) | 返回字符串中從下標beginIndex(包括)開始到字符串結尾 的子字符串 |
正則表達式的概念
正則表達式本質(zhì)就是一個“規(guī)則字符串”,可以用于對字符串數(shù)據(jù)的格式進行驗證,以及匹配、查 找、替換等操作。該字符串通常使用^運算符作為開頭標志,使用$運算符作為結尾標志,當然也可以省 略。
正則表達式的規(guī)則
| 正則表達式 | 說明 |
|---|---|
| [abc] | 可以出現(xiàn)a、b、c中任意一個字符 |
| [^abc] | 可以出現(xiàn)任何字符,除了a、b、c的任意字符 |
| [a-z] | 可以出現(xiàn)a、b、c、……、z中的任意一個字符 |
| [a-zA-Z0-9] | 可以出現(xiàn)az、AZ、0~9中任意一個字符 |
| . | 任意一個字符(通常不包含換行符) |
| \d | 任意一個數(shù)字字符,相當于[0-9] |
| \D | 任意一個非數(shù)字字符 |
| \s | 空白字符,相當于[\t\n\x0B\f\r] |
| \S | 非空白字符 |
| \w | 任意一個單詞字符,相當于[a-zA-Z_0-9] |
| \W | 任意一個非單詞字符 |
| X? | 表示X可以出現(xiàn)一次或一次也沒有,也就是0 ~ 1次 |
| X* | 表示X可以出現(xiàn)零次或多次,也就是0 ~ n次 |
| X+ | 表示X可以出現(xiàn)一次或多次,也就是1 ~ n次 |
| X{n} | 表示X可以出現(xiàn)恰好 n 次 |
| X{n,} | 表示X可以出現(xiàn)至少 n 次,也就是>=n次 |
| X{n,m} | 表示X可以出現(xiàn)至少 n 次,但是不超過 m 次,也就是>=n并且<=m次 |
用 () 進行分組,無實際意義
正則表達式相關的方法
| 方法名稱 | 方法說明 |
|---|---|
| boolean matches(String regex) | 判斷當前正在調(diào)用的字符串是否匹配參數(shù)指定的正則表達式規(guī) 則 |
| String[] split(String regex) | 參數(shù)regex為正則表達式,以regex所表示的字符串為分隔 符,將字符串拆分成字符串數(shù)組 |
| String replace(char oldChar, char newChar) | 使用參數(shù)newChar替換此字符串中出現(xiàn)的所有參數(shù) oldChar |
| String replaceFirst(String regex, String replacement) | 替換此字符串匹配給定的正則表達式的第一個子字符串 |
| String replaceAll(String regex, String replacement) | 將字符串中匹配正則表達式regex的字符串替換成 replacement |
可變字符串類
基本概念
由于String類描述的字符串內(nèi)容是個常量不可改變,當需要在Java代碼中描述大量類似的字符串 時,只能單獨申請和存儲,此時會造成內(nèi)存空間的浪費。
為了解決上述問題,可以使用java.lang.StringBuilder類和java.lang.StringBuffer類來描述字符序 列可以改變的字符串,如:"ab"。
StringBuffer類是從jdk1.0開始存在,屬于線程安全的類,因此效率比較低。
StringBuilder類是從jdk1.5開始存在,屬于非線程安全的類,效率比較高。
StringBuilder類常用的構造方法
| 方法聲明 | 功能介紹 |
|---|---|
| StringBuilder() | 使用無參方式構造對象,容量為16 |
| StringBuilder(int capacity) | 根據(jù)參數(shù)指定的容量來構造對象,容量為參數(shù)指定大小 |
| StringBuilder(String str) | 根據(jù)參數(shù)指定的字符串來構造對象,容量為:16+字符串長度 |
StringBuilder類常用的成員方法
| 方法聲明 | 功能介紹 |
|---|---|
| int capacity() | 用于返回調(diào)用對象的容量 |
| int length() | 用于返回字符串的長度,也就是字符的個數(shù) |
| StringBuilder insert(int offset, String str) | 插入字符串并返回調(diào)用對象的引用,就是自己。 |
| StringBuilder append(String str) | 追加字符串 |
| StringBuilder deleteCharAt(int index) | 將當前字符串中下標為index位置的單個字符 刪除 |
| StringBuilder delete(int start,int end) | 刪除字符串 |
| StringBuilder replace(int start,int end, String str) | 替換字符串 |
| StringBuilder reverse() | 字符串反轉 |
| StringBuilder setCharAt(int index,char char) | 修改下標為index的字符為char |
注意 作為參數(shù)傳遞的話,方法內(nèi)部String不會改變其值,StringBuffer和StringBuilder會改變其值。
返回值的設計
StringBuilder的很多方法的返回值均為StringBuilder類型。這些方法的返回語句均為:return this。
由此可見,這些方法在對StringBuilder所封裝的字符序列進行改變后又返回了該對象的引用?;?于這樣設計的目的在于可以連續(xù)調(diào)用。
擴容算法源碼分析
當字符串的長度超過了字符串對象的初始容量時,該字符串對象會自動擴容,默認擴容算法是:原始容量 *2+2
底層采用byte數(shù)組來存放所有的字符內(nèi)容
考點
考點一:既然StringBuilder類的對象本身可以修改,那么為什么成員方法還有返回值呢? 解析:為了連續(xù)調(diào)用 sb3.reverse().append("1").append("2").insert(0, "3").delete(0, 1).reverse();
考點二:如何實現(xiàn)StringBuilder類型和String類型之間的轉換呢? String str3 = sb3.toString(); StringBuilder sb5 = new StringBuilder(str3);
考點三:String、StringBuilder、StringBuffer之間效率誰高?排列如何? String < StringBuffer < StringBuilder
