Notes 20180312 : String第四講_String上的操做

  做爲一個基本的工具類,同時又是使用頻率很高的類,Java爲其提供了豐富的方法支持。Java中的String類中包含了50多個方法。最使人驚訝的是絕大多數方法都頗有用,下面咱們根據功能來分類介紹一下:html

1. 關於碼點的方法

  在昨天咱們探討了一下碼點,其中也詳細敘述了碼點的方法,這裏我就再也不贅述,只追加出來:java

  • int    codePointAt(int index)  返回指定索引處的字符(Unicode代碼點)。  IndexOutOfBoundsException
  • int    codePointBefore(int index)  返回指定索引以前的字符(Unicode代碼點)。  IndexOutOfBoundsException
  • int    codePointCount(int beginIndex, int endIndex)  返回此 String指定文本範圍內的Unicode代碼點數IndexOutOfBoundsException
  • int    offsetByCodePoints(int index, int codePointOffset)   返回此 String內的指數,與 index codePointOffset代碼點。IndexOutOfBoundsException

2. 字符串的長度

  String中提供了兩個方法用於獲取長度,關於這兩個方法,前面介紹碼點時,也介紹過,不在詳細說了;正則表達式

  • int    length()  返回此字符串的長度(碼點單元數量)。
  • int    codePointCount(int beginIndex, int endIndex)  返回此 String指定文本範圍內的Unicode代碼點數IndexOutOfBoundsException

3. 提升效率的一個方法String.intern()

  是在不知道該怎麼介紹該方法,因此取了這麼個名字,該方法本人在另外一篇文章中詳細說過,參見之;express

4.  根據給定條件查詢字符串

  Java中針對數組提供了兩種查詢方式,一種是根據已知的索引查詢該位置的代碼單元,一種是根據已知的字符查詢索引位置,下面咱們來看看:數組

4.1 根據字符查詢索引

  根據字符來查詢對應索引,String提供了8個這樣的方法,這8個方法不會出現索引越界的異常,查詢不到會返回-1,這8個方法分爲正向查找(indexOf)和反向查找(lastIndexOf);工具

  1.   indexOf(int ch)  返回指定字符第一次出現的字符串內的索引。
  2.    indexOf(int ch, int fromIndex)  返回指定字符第一次出現的字符串內的索引,以指定的索引開始搜索。
  3.    indexOf(String str)  返回指定子字符串第一次出現的字符串內的索引。
  4.    indexOf(String str, int fromIndex)  返回指定子串的第一次出現的字符串中的索引,從指定的索引開始。
  5.    lastIndexOf(int ch)  返回指定字符的最後一次出現的字符串中的索引。
  6.    lastIndexOf(int ch, int fromIndex)  返回指定字符的最後一次出現的字符串中的索引,從指定的索引(包含)開始向後搜索。
  7.    lastIndexOf(String str)  返回指定子字符串最後一次出現的字符串中的索引。
  8.    lastIndexOf(String str, int fromIndex)  返回指定子字符串的最後一次出現的字符串中的索引,從指定索引開始向後搜索。
/**
     * 根據給定信息查詢字符串
     */
    @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

4.2 根據給定字符查詢索引

  上面咱們看過了給定字符查詢索引,那麼一樣的咱們也能夠按照給定字符查詢索引:ui

  • char    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的再次測試,咱們發現,針對輔助字符的查詢是不能正常查詢出來的編碼

4.3 總結

  1.   根據給定索引查找字符,遇到輔助字符不能正常查詢,而且會出現索引越界異常;
  2.   根據給定字符查詢索引,不會出現越界異常,若是查詢不到返回-1,能夠完成對輔助字符的查詢,若是給定輔助字符的給定代碼單元,那麼查詢到該代碼單元所在的位置,若是給定輔助字符,那麼查詢到該輔助字符的第一個輔助字符的第一個代碼單元.按照從後向前查找的話,那麼會從給定的索引開始查起,包含該索引;

5. 字符串的比較與判斷

  咱們對於數據的操做每每是增刪改查,而查每每是須要經過比較的,String中天然也提供了一系列用於比較的方法:spa

  1.   int    compareTo(String anotherString)按字典順序比較兩個字符串。
  2.   int    compareToIgnoreCase(String str)按字典順序比較兩個字符串,忽略大小寫差別。
  3.   boolean  contentEquals(CharSequence cs)  將此字符串與指定的CharSequence進行 CharSequence 。區別大小寫
  4.   boolean  contentEquals(StringBuffer sb)  將此字符串與指定的StringBuffer進行 StringBuffer 。區別大小寫
  5.   boolean  endsWith(String suffix)  測試此字符串是否以指定的後綴結尾。
  6.   boolean  equals(Object anObject)  將此字符串與指定對象進行比較。
  7.   boolean  equalsIgnoreCase(String anotherString)  將此 String與其餘 String比較,忽略案例注意事項。
  8.   boolean  isEmpty()  返回 true若是,且僅當 length()爲 0 。
  9.  startsWith(String prefix)測試此字符串是否以指定的前綴開頭。
  10.  startsWith(String prefix, int toffset)測試在指定索引處開始的此字符串的子字符串是否以指定的前綴開頭。
  11.  matches(String regex)  告訴這個字符串是否匹配給定的 regular expression 。正則表達式
  12.  regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)測試兩個字符串區域是否相等。能夠給定參數判斷是否考慮大小寫
  13.  regionMatches(int toffset, String other, int ooffset, int len)測試兩個字符串區域是否相等。
  14.  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
    }

6. 字符串的鏈接

  前面咱們講過經過重載"+"能夠將實現將兩個對象鏈接到一塊兒,而且返回一個字符串,底層是經過調用各自的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
    }
}

7. 獲取新字符串

   獲取新字符串是個很大的概念,之因此取這樣一個名稱,是由於我把不少經過一些的給定條件返回一個字符串的方法都放在這節來說;

7.1 根據給定的字符數組獲得String

  String的底層是char[],

  1. copyValueOf(char[] data)  至關於 valueOf(char[])
  2. 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));
    }
}

7.2 經過字符序列獲取字符串

  String是字符序列,可是字符序列並不包含String這一種,而是不少種組成的,那麼String就提供了一種方式,用於將不一樣的字符序列組成一個字符串,方法以下;

  1. join(CharSequence delimiter, CharSequence... elements) 返回一個新的字符串,由 CharSequence elements的副本組成,並附有指定的delimiter的 delimiter 即以delimiter做爲分隔符。
  2. 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));
    }

}

7.3 替換字符串中的內容

  數據有增刪改查,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.4 子串獲取

  字符串提供了用於獲取字符串中子串的方法,以下:

  1. subSequence(int beginIndex, int endIndex)   返回一個字符序列,該序列是該序列的子序列。
  2. substring(int beginIndex)   返回一個字符串,該字符串是此字符串的子字符串。
  3. substring(int beginIndex, int endIndex)   返回一個字符串,該字符串是此字符串的子字符串。

 

 

7.5  截取字符串

  1. split(String regex)   將此字符串分割爲給定的 regular expression的匹配。
  2. split(String regex, int limit)   將這個字符串拆分爲給定的 regular expression的匹配。

 

 

 

8. 字符串的格式化

format(Locale l, String format, Object... args)
使用指定的區域設置,格式字符串和參數返回格式化的字符串。
format(String format, Object... args)
使用指定的格式字符串和參數返回格式化的字符串。

9. 字符串與字節數組的相互轉換

getBytes()

使用平臺的默認字符集將此 String編碼爲字節序列,將結果存儲到新的字節數組中。
getBytes(Charset charset)
使用給定的 charset將該 String編碼爲字節序列,將結果存儲到新的字節數組中。
getBytes(String charsetName)
使用命名的字符集將此 String編碼爲字節序列,將結果存儲到新的字節數組中。
 

10. String提供的其它方法

intern()

返回字符串對象的規範表示。
相關文章
相關標籤/搜索