String類和可變字符串類詳解

來源:拉勾教育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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容