做爲一個基本的工具類,同時又是使用頻率很高的類,Java爲其提供了豐富的方法支持。Java中的String類中包含了50多個方法。最使人驚訝的是絕大多數方法都頗有用,下面咱們根據功能來分類介紹一下:html
在昨天咱們探討了一下碼點,其中也詳細敘述了碼點的方法,這裏我就再也不贅述,只追加出來:java
codePointAt(int index)
返回指定索引處的字符(Unicode代碼點)。 IndexOutOfBoundsException
codePointBefore(int index)
返回指定索引以前的字符(Unicode代碼點)。 IndexOutOfBoundsException
codePointCount(int beginIndex, int endIndex)
返回此 String
指定文本範圍內的Unicode代碼點數。IndexOutOfBoundsException
offsetByCodePoints(int index, int codePointOffset)
返回此 String
內的指數,與 index
codePointOffset
代碼點。IndexOutOfBoundsException
String中提供了兩個方法用於獲取長度,關於這兩個方法,前面介紹碼點時,也介紹過,不在詳細說了;正則表達式
length()
返回此字符串的長度(碼點單元數量)。codePointCount(int beginIndex, int endIndex)
返回此 String
指定文本範圍內的Unicode代碼點數。IndexOutOfBoundsException
是在不知道該怎麼介紹該方法,因此取了這麼個名字,該方法本人在另外一篇文章中詳細說過,參見之;express
Java中針對數組提供了兩種查詢方式,一種是根據已知的索引查詢該位置的代碼單元,一種是根據已知的字符查詢索引位置,下面咱們來看看:數組
根據字符來查詢對應索引,String提供了8個這樣的方法,這8個方法不會出現索引越界的異常,查詢不到會返回-1,這8個方法分爲正向查找(indexOf)和反向查找(lastIndexOf);工具
/** * 根據給定信息查詢字符串 */ @Test public void fun3(){ String str1 = "歸雲一去無蹤影,何處是前期?"; String str2 = "123242543534121214"; System.out.println("字符一在字符串中的位置:"+str1.indexOf('一')); System.out.println("字符何從索引2開始尋找,索引是:"+str1.indexOf('何', 2)); System.out.println("字符串何處的索引是:"+str1.indexOf("何處")); System.out.println("字符串何處的索引從給定索引找是:"+str1.indexOf("何處", 3)); System.out.println("----"+str1.indexOf("何處", 9));//查找不到返回-1 System.out.println("字符1最後一次出現的位置是:"+str2.lastIndexOf('1')); System.out.println("字符1從索引5開始反向尋找,最後一次出現的位置是:"+str2.lastIndexOf('2', 5)); System.out.println("字符串12出現的最後位置:"+str2.lastIndexOf("12")); System.out.println("字符串12出現的最後位置,從給定的索引反向查詢:"+str2.lastIndexOf("12", 15)); System.out.println("若是lastIndexOf的參數是空字符串,那麼返回的結果和求字符串長度是同樣的:"+str2.lastIndexOf("")); System.out.println("字符串長度:"+str2.length()); System.out.println("若是查詢的在字符串中沒有出現:"+str1.indexOf('1')); System.out.println("若是查詢的在字符串中沒有出現:"+str2.lastIndexOf(" ")); String str = "jojjjjj"; //查找指定字符在字符串中第一次出現的位置,若字符串中沒有要查找的字符返回-1 System.out.println("j第一次出現的位置是:"+str.indexOf('。')); //返回在此字符串中第一次出現指定字符處的索引,從指定的索引開始搜索。若字符串中沒有要查找的字符返回-1 System.out.println("o在腳標2後第一次出現的索引:"+str.indexOf('o', 2)); System.out.println(str2.lastIndexOf(100));//索引越界不會異常,會返回負值-1 字符串中凡是查詢不到那麼就返回-1 }
下面咱們再看一個涉及到輔助字符的操做;測試
String str3 = "𝕆is the set 𝕆is"; System.out.println(str3.indexOf(105));//2 System.out.println(str3.indexOf(56646));//1 查詢輔助字符第二個代碼單元 System.out.println(str3.indexOf("𝕆"));// 0 佔用了兩個代碼單元,因此給出了第一個代碼單元的索引 System.out.println(str3.indexOf("𝕆", 4));//13 System.out.println(str3.lastIndexOf(56646));//14 System.out.println(str3.lastIndexOf("𝕆"));//13 System.out.println(str3.lastIndexOf("i", 15));//15 System.out.println(str3.lastIndexOf(56646, 12));//1
上面咱們看過了給定字符查詢索引,那麼一樣的咱們也能夠按照給定字符查詢索引:ui
charAt(int index)
返回 char
指定索引處的值(字符)。System.out.println(str3.charAt(0)+"___"+str3.charAt(1)+"____"+str3.charAt(2));//?___?____i
// System.out.println(str3.charAt(1000));java.lang.StringIndexOutOfBoundsException: String index out of range: 1000
這段代碼是對上面str3的再次測試,咱們發現,針對輔助字符的查詢是不能正常查詢出來的編碼
咱們對於數據的操做每每是增刪改查,而查每每是須要經過比較的,String中天然也提供了一系列用於比較的方法:spa
startsWith(String prefix)
測試此字符串是否以指定的前綴開頭。
startsWith(String prefix, int toffset)
測試在指定索引處開始的此字符串的子字符串是否以指定的前綴開頭。
matches(String regex)
告訴這個字符串是否匹配給定的 regular expression 。正則表達式
regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
測試兩個字符串區域是否相等。能夠給定參數判斷是否考慮大小寫
regionMatches(int toffset, String other, int ooffset, int len)
測試兩個字符串區域是否相等。 contains(CharSequence s)
當且僅當此字符串包含指定的char值序列時才返回true。
/** * 按照字典書序比較兩個字符串 * 按字典順序比較兩個字符串。該比較基於字符串中各個字符的 Unicode 值。 * 按字典順序將此 String 對象表示的字符序列與參數字符串所表示的字符序列進行比較。 * 若是按字典順序此 String 對象位於參數字符串以前,則比較結果爲一個負整數。 * 若是按字典順序此 String 對象位於參數字符串以後,則比較結果爲一個正整數。 * 若是這兩個字符串相等,則結果爲 0; * compareTo 只在方法 equals(Object) 返回 true 時才返回 0。 */ @Test public void compareStrings(){ String str1 = "𝕆is The set 𝕆is"; String str2 = "𝕆is the est 𝕆is"; System.out.println("比較兩個字符串的字典順序,考慮大小寫:" + str1.compareTo(str2) ); System.out.println("T:" + str1.codePointAt(5) + "--" + "t:" + str2.codePointAt(5)); System.out.println("比較兩個字符串的字典順序,不考慮大小寫:" + str1.compareToIgnoreCase(str2)); System.out.println("s:" + str1.codePointAt(9) + "--" + "e:" + str2.codePointAt(9)); }
@Test public void test(){ String str = "綠黛紅顏兩相發,千嬌百媚情無歇!"; System.out.println("判斷是否以字符串結尾:" + str.endsWith("情無歇.")); System.out.println("判斷是否以字符串結尾:" + str.endsWith("情無歇!")); System.out.println("判斷是否以字符串開始:" + str.startsWith("綠黛紅顏")); System.out.println("判斷是在指定索引處是否以字符串開始:" + str.startsWith("千嬌百媚", 3));
System.out.println(str.contains("千嬌百媚"));//true }
@Test public void test2(){ String str1 = "aabbccdd"; String str2 = "aabcccdd"; String str3 = "aabbccdd"; String str4 = "Aabbccdd"; StringBuffer sb1 = new StringBuffer(str3); StringBuffer sb2 = new StringBuffer(str4); System.out.println(str1.contentEquals(str2));//false System.out.println(str1.contentEquals(str3));//true System.out.println(str1.contentEquals(str4));//false System.out.println(str1.contentEquals(sb1));//true System.out.println(str1.contentEquals(sb2));//false
System.out.println(str1.equals(str3));//true
System.out.println(str1.equals(str4));//false
System.out.println(str1.equalsIgnoreCase(str4));//true
}
/** * 字符串非空判斷 */ @Test public void test3(){ String str1 = "aabcccdd"; String str2 = ""; String str3 = " "; String str4 = null; System.out.println(str1.isEmpty()); System.out.println(str2.isEmpty()); System.out.println(str3.isEmpty()); // System.out.println(str4.isEmpty());空指針異常 test4(str1); test4(str2); test4(str3); test4(str4); } public void test4(String str){ //僞非空判斷 if(str == null || str.isEmpty()){ System.out.println(str + "該字符串爲空!"); } //非空判斷的真是操做 if(str != null && !str.isEmpty()){ System.out.println("str:"+str+"__"+"該字符串爲空!"); } }
@Test public void fun1(){ String str1 = "aabbccdd"; String str2 = "aabcccDd"; System.out.println(str1.regionMatches(2, str2, 2, 2));//false System.out.println(str1.regionMatches(4, str2, 4, 2));//true System.out.println(str1.regionMatches(4, str2, 4, 3));//false System.out.println(str1.regionMatches(true, 4, str2, 4, 3));//true System.out.println(str1.regionMatches(false, 4, str2, 4, 3));//false System.out.println(str1.matches("\\p{Lower}{3,}"));//匹配出現至少3個小寫字母 true }
前面咱們講過經過重載"+"能夠將實現將兩個對象鏈接到一塊兒,而且返回一個字符串,底層是經過調用各自的toString和StringBuilder,String中除了重載"+",提供了另外一種鏈接字符串的方法:
String concat(String str)
將指定的字符串鏈接到該字符串的末尾。package cn.charsequence.string.concat; public class StringConcat { public static void main(String[] args) { String str1 = "23131"; String str2 = "dsfa"; String str3 = ""; String str4 = null; System.out.println(str1.concat(str2)); System.out.println(str1.concat(str3)); // System.out.println(str1.concat(str4));注意不能和null在一塊兒操做,不然會出現nullPointException } }
獲取新字符串是個很大的概念,之因此取這樣一個名稱,是由於我把不少經過一些的給定條件返回一個字符串的方法都放在這節來說;
String的底層是char[],
copyValueOf(char[] data)
至關於 valueOf(char[])
。copyValueOf(char[] data, int offset, int count)
至關於 valueOf(char[], int, int)
。
package cn.charsequence.string.getString; public class CopyValueOf { public static void main(String[] args) { String str1 = "aaaa"; char[] ch = {'b','b','b','b','b','b'}; System.out.println(String.copyValueOf(ch)); System.out.println(String.copyValueOf(ch, 2, 4));//當心IndexOutOf System.out.println(str1.copyValueOf(ch));//對象調用,那麼不會考慮對象原有內容 System.out.println(str1.copyValueOf(ch, 2, 4)); } }
String是字符序列,可是字符序列並不包含String這一種,而是不少種組成的,那麼String就提供了一種方式,用於將不一樣的字符序列組成一個字符串,方法以下;
join(CharSequence delimiter, CharSequence... elements)
返回一個新的字符串,由 CharSequence elements
的副本組成,並附有指定的delimiter的 delimiter
即以delimiter
做爲分隔符。join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
返回一個新 String
的副本組成 CharSequence elements
與指定的副本一塊兒加入 delimiter
。//該方法能夠用於咱們本身寫的繼承CharSequence的類,可是須要實現Iterable接口,由於該方法中有增強for循環.package cn.charsequence.string.getString; import java.util.ArrayList;import java.util.List; public class CharSequenceToString{ public static void main(String[] args) { StringBuffer sbf = new StringBuffer("我是StringBuffer!"); StringBuilder sbi = new StringBuilder("我是StringBuilder!"); String str = "__"; List<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); System.out.println(String.join(str, list)); System.out.println(String.join(str, sbf,sbi,sbf)); } }
數據有增刪改查,String天然也提供了"修改"的方法,其實是構造一個新的char[],String的不可變並未所以發生改變。String提供了幾個用於改變內容的方法以下:
replace(char oldChar, char newChar)
返回從替換全部出現的致使一個字符串 oldChar
在此字符串 newChar
。
replace(CharSequence target, CharSequence replacement)
將與字面目標序列匹配的字符串的每一個子字符串替換爲指定的字面替換序列。
replaceAll(String regex, String replacement)
用給定的替換替換與給定的 regular expression匹配的此字符串的每一個子字符串。
replaceFirst(String regex, String replacement)
用給定的替換替換與給定的 regular expression匹配的此字符串的第一個子字符串。
package cn.charsequence.string.replace; import org.junit.Test; public class ReplaceString { /** * 替換 */ @Test public void test1(){ String str1 = "山中何全部 ,嶺上多白 雲。只可自怡悅,不堪持贈君。"; StringBuilder sb = new StringBuilder("白雲"); System.out.println(str1.replace("白雲", "黑雲")+"_"+str1); System.out.println(str1.replace(sb, "黑雲")+"_"+str1); System.out.println(str1.length()); System.out.println(str1.replaceAll("\\s", "").length() + str1.replaceAll("\\s", "")); System.out.println(str1.replaceFirst("\\s", "").length() + str1.replaceAll("\\s", "")); } }
字符串提供了用於獲取字符串中子串的方法,以下:
7.5 截取字符串
getBytes()
String
編碼爲字節序列,將結果存儲到新的字節數組中。
10. String提供的其它方法
intern()