String
- 字符串是什麼
- 字符串的特點
- 字符串的API
- 字符串的常量池
- 字符串的衍生類
- StringBuilder的常用API
- String與其衍生類的區別
字符串是什麼
一種引用數據類型
- 顧名思義,字符串是由字符組成的長串,所以字符串的實現原理是字符數組
字符串的特點
- 不可變:字符串本質是字符數組,而數組是被final修飾的(即數組是不可變的)
- 對字符串的操作:創建一個新的字符串,內容爲源字符串進行操作後的結果,再將源字符串的引用指向新的字符串
- 不可被繼承:String類被final修飾,無法被繼承
- 直接賦值:字符串可以像基本數據類型一樣直接賦值
- String=“10”;
- String=“字符串”;
- 做加法:字符串的加法本質是字符串的拼接
- 任何類型的數據與字符串做加法,運算結果都是字符串
字符串的API
以下是字符串的原生API
- 構造方法:
- 空參構造器:new String(),創建的字符串爲空(不是null)
- 有參構造器:String,int[],byte[],char[],StringBuffer,StringBuilder
- 比較兩個字符串:
- int CompareTo(String s):按字典順序比較兩個字符串,參數大,返回正數;參數小,返回負數;完全相等,返回0(按位依次比較,返回值累加)
- int CompareIgnoreCase(String s):按字典順序比較兩個字符串,不考慮大小寫
- boolean contains(String s):字符串是否包含指定字符串,若包含,則返回true;反之,則返回false
- static String copyValueOf(char[ ] chars):將字符數組轉成字符串
- boolean endsWith(String s):若字符串以指定字符串結尾,則返回true;反之,返回false
- 使用場景:判斷郵箱後綴,例如是否以qq.com結尾
- boolean startsWith(String s):若字符串以指定字符串開頭,則返回true;反之,返回false
- 使用場景:判斷電話號碼的區號、手機號碼所屬國家等
- boolean startsWith(String s,int index):若從索引位置開始以指定字符串開頭,則返回true;反之,返回false
- boolean equals(Object o):字符串與任意類型的數據比較,若相等,則返回true;反之,則返回false
- String中的equals()已被重寫
- boolean equalsIgnoreCase(String s):字符串與任意類型的數據比較,不考慮大小寫
- int indexOf():
- indexOf(int ch):返回字符在此字符串中第一次出現的位置的索引
- 需要注意的是:所需參數並非是完全意義上的整形,而是一個字符,ch爲字符的Unicode碼
- indexOf(int ch,int fromIndex):返回從指定索引(包括指定索引)位置開始,字符第一次出現的位置的索引
- indexOf(String s):返回字符串在此字符串中第一次出現的位置的索引
- indexOf(String s,int fromIndex):返回從索引(包括索引)位置開始,字符串第一次出現的位置的索引
- indexOf(int ch):返回字符在此字符串中第一次出現的位置的索引
- int laseIndexOf(…):返回[參數]在此字符串中最後一次出現的位置的索引
- 重載方法與indexOf(…)類似
- boolean isEmpty():判斷字符串是否爲"",若爲空,則返回true;反之,返回false
- String replace(char oldChar,char newChar):用新字符替換字符串中的舊字符
- String subString(int beginIndex):從索引處開始截取字符串
- String subString(int beginIndex,int endIndex):從[beginIndex]索引處開始截取字符串,到[endIndex]索引處結束
- 注意:不包含[endIndex]索引處的字符
- String toLowerCase():將字符串所有字母小寫化
- String toUpperCase():將字符串所有字母大寫化
- String trim():去除字符串前後的空格,不去除字符串內部的空格,常用於用戶名驗證
- static String valueof(E e):將任意類型的數據轉化爲字符串
以下是字符串實現CharSequence的API
- int length():返回字符串的字符個數
- 雙引號內的所有內容,包括字母、漢字、空格、標點符號、特殊符號
- char charAt(int index)
- 返回字符串中索引爲[index]的字符,索引從0開始
字符串的常量池
-
常量池範圍:無限大
- 與Integer常量池的區別:Integer常量池有範圍(-128~127)
-
一般進池方式:所有通過直接賦值方式創建的字符串都會進常量池
-
特殊進池方式:
-
通過字面量直接運算得到的字符串也會進常量池,例如:
public static void main(String args[]){ String s = "he"+"llo"; //此時s會進入常量池 }
-
運算中存在變量時,運算得到的字符串不會進常量池,例如:
public static void main(String args[]){ String s1 = "he"; String s = s1+"llo"; //此時s不會進入常量池 }
-
字符串的衍生類
String有兩個衍生類:
- StringBuffer
- StringBuilder
它們出現的目的是改進字符串的缺點,改進有兩方面組成:
- 不可變—>可變
- 線程不安全—> 線程安全(StringBuffer安全,StringBuilder不安全)
它們倆除了在線程安全方面有所差異,其它方面並無明顯差別,所以接下來的API介紹會以StringBuilder爲例
StringBuilder的常用API
-
構造方法:
- StringBuilder():創建一個空的StringBuilder,初始容量爲16個字符
- StringBuilder(int capacity):創建一個空的StringBuilder,長度由傳入的參數控制
- StringBuilder(CharSequence seq):傳入字符
- StringBuilder(String str):傳入字符串
-
append():
- append(E e):將任意類型的參數追加到序列末尾,有多種重載
- append(char[],int start,int length):從數組的[start]位置開始,長度爲length個元素追加到序列末尾
- append(String str,int start,int end):從字符串的[start]位置開始,到[end]位置結束的字符都追加到序列末尾,不包括[end]位置的元素
-
delete(int start,int end):刪除從[start]到[end]之間的所有字符串,不包括[end]處的字符
-
deleteCharAt(int index):刪除指定索引處的字符
-
replace(int start,int end,String str):將[start]到[end]位置的內容替換爲新字符串,不包括[end]處的字符
- 與String的區別:String是單個字符的替換,StringBuffer是長串字符的替換
-
insert():
- insert(int index,E e):將所有類型的參數插入字符串的指定位置
- insert(int index,String str,int start,int end):截取[start]到[end]位置的字符串插入到[index]位置,不包括[end]位置的字符
- insert(int index,CharSequence seq,int start,int end):截取[start]到[end]位置的元素插入到[index]位置,不包括[end]位置的字符
-
reverse():將字符串中的內容前後倒置
-
subSequence(int start,int end):與String的方法類似
-
其它方法的使用方式均與String相同
以上方法的返回值均爲StringBuffer對象本身
String與其衍生類的區別
String | StringBuffer | StringBuilder | |
---|---|---|---|
是否可被繼承 | × | × | × |
是否可變 | × | √ | √ |
是否線程安全 | × | √ | × |
線程安全(StringBuffer)效率低,線程不安全(StringBuilder)效率高,單個線程時優先使用StringBuilder