複習3:String

String

  • 字符串是什麼
  • 字符串的特點
  • 字符串的API
  • 字符串的常量池
  • 字符串的衍生類
  • StringBuilder的常用API
  • String與其衍生類的區別

字符串是什麼

一種引用數據類型

  • 顧名思義,字符串是由字符組成的長串,所以字符串的實現原理是字符數組

字符串的特點

  • 不可變:字符串本質是字符數組,而數組是被final修飾的(即數組是不可變的)
    • 對字符串的操作:創建一個新的字符串,內容爲源字符串進行操作後的結果,再將源字符串的引用指向新的字符串
  • 不可被繼承:String類被final修飾,無法被繼承
  • 直接賦值:字符串可以像基本數據類型一樣直接賦值
    • String=“10”;
    • String=“字符串”;
  • 做加法:字符串的加法本質是字符串的拼接
    • 任何類型的數據與字符串做加法,運算結果都是字符串

字符串的API

以下是字符串的原生API

  • 構造方法:
    • 空參構造器:new String(),創建的字符串爲空(不是null)
    • 有參構造器:String,int[],byte[],char[],StringBufferStringBuilder
  • 比較兩個字符串:
    • 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):返回從索引(包括索引)位置開始,字符串第一次出現的位置的索引
  • 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章