1. 程式人生 > 實用技巧 >String相關

String相關

一. 概述


  1. String為引用資料型別,是一個工具類,在java.long包中。宣告如下:public final class String extends Object

    注:final修飾表示不能繼承

  2. 關於字面值(直接量)

    • 數值型字面值:整數 浮點數
    • 字元型字面值:字元'a'
    • 布林型字面值:true false
    • 字串字面值:“abc”//可以為空

    注:java程式中所有用到的字面值,都是String的例項

  3. 字串是常量:引用不能發生改變

    • String 引用=字串字面值

    • String 引用=new String(“字面值”)

  4. 底層

    String中的屬性:private final char value[]

    可以看出其本質是一個char陣列

二. 關於字串定義和引用


Ⅰ. value陣列 由final修飾,不能修改,只能新建

String s1="abc";
s1="str"

Ⅱ. Java對於String,會查詢常量池,而非直接新建堆

String s1="abc";
String s2="abc";

Ⅲ.

String s1 = new String("abc")

【注】

  1. string s1="abc";string s2="abc";

    在堆中只建立了一個物件

  2. String s1=new String(“abc”);String s2=new String("abc")

    在堆中建立了兩個物件

  3. String s1=“ab”;String s2=‘a’+‘b’

    同地址。因為字串的字面值,java編譯會進行優化,編譯後為:string s2="ab"

  4. String s="ab";String s1="a";String s2=s1+"b";Sout(s==s2)//false

    1.與③對比,s1不是字面值,無法優化編譯

    2.頂層返回新的地址空間

三. 構造方法


  1. String()

    初始化一個新物件,表示一個空字元序列

  2. String(Char[] value)

    分配一個新的String,使其表示字元陣列引數中當前包含的字元序列;將字元陣列轉化為字串

  3. String(char[] value,int offset,int count)

    分配一個新的String,包含取自字元陣列的一個子陣列。其中:

    Int offset:起始的下標

    Int count:個數

    將字元陣列中部分字元轉為字串

  4. String(byte[] bytes)

    通過使用平臺的預設字符集解碼指定的byte陣列,構建一個新的String

  5. String(byte[] bytes,String charsetName)

    通過使用指定的charset解碼指定的byte陣列,構造一個新的String

四. String 常用方法


  1. char charAt(int index)

    返回指定索引處的char值,小心越界異常

  2. int length()

    返回字串長度

  3. char[] toCharArray()

    將字串轉成一個新的字元陣列,修改字元陣列的元素的值不會影響原字串的內容;

  4. int compareTo(String anotherString)

    按字典順序比較

    1. 獲取兩個字串長度最小的值,在此範圍內依下標比較

    2. 如果相等則比較下一位,否則返回當前字元-引數字元

    3. 長度範圍內都相等,最後返回當前字串長度-引數字串長度

      總結:返回0:相等;負數:當前小;正數:當前大

  5. Int compare TolgonreCase(String str)

    不分大小寫進行字典序比較

  6. String concat(String s1)

    將指定字串連線到此字串的結尾

    效率比+高,但高不到哪裡去,一般情況下用+就行了

  7. boolean contains(CharSequence s)

    當且僅當字串中包含指定的char值序列時,返回true。

    注:CharSequnce是個介面,String已經預設實現了,這裡也是向上造型

  8. boolean endsWith(String suffix)

    測試此字串是否以指定的字尾結束

    應用場景:根據字尾判斷檔案型別

  9. boolean startsWith(String prefix)

    測試此字串是否以指定的字首開始

  10. boolean startsWith(String prefix,int toffset)

    測試此字串從指定索引開始的字串是否以指定字首開始

  11. int infexOf(int ch)

    返回指定字元在此字串中第一次出現的索引

    從0開始,如果沒有則返回-1

  12. Int indexOf(int ch,int fromIndex)

    返回在此字串中第一次出現指定字元處的索引,從指定的索引開始搜尋,沒有則返回-1

  13. Int indexOf(String str)

    返回指定子字串在此字串中第一次出現處的索引

  14. Int indexOf(String str,int fromIndex)

    返回指定字串在此字串中第一次出現處的索引。從指定的索引開始

  15. Int lastIndexOf(int ch)

    Int lastIndexOf(int ch,int fromIndex)

    Int lastIndexOf(String str)

    Int lastIndexOf(String str,int fromIndex)

  16. Boolean equals(Object anObject)

    將此字串與指定的物件比較

    String重寫了equals方法

  17. Boolean equalsIgnoreCase(string anotherString)

  18. byte[] getBytes()

    使用平臺的預設字符集將此String 編碼為byte(二進位制)序列,並將結果儲存到一個新的byte陣列中

    字元轉二進位制:將字元對映到整數碼

    碼錶不同,中文所佔位元組數不同

    GBK:1個字元佔2個位元組

    Utf-8:一個字元佔3個位元組

    注意:Idea中預設所有專案的編碼都是UTF-8

    eclipse中預設的編碼和平臺便把一致--GBK

  19. byte[] getBytes(String charsetName)

    使用指定的字符集將此String編碼為byte(二進位制)序列,並將結果儲存到一個新的byte陣列中

  20. int hashCode()

    返回此字串的雜湊碼

    \(S[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]*31^0\)

    空字串的雜湊值為0

  21. boolean isEmpty()

    當且僅當length()為0時返回true

  22. String replace(Char target,Char replacement)

    String replace(CharSequence target,CharSequence replacement)

    使用指定的字面值序列,替換此字串中所有匹配的的字面值

  23. String substring(int beginIndex)

    返回一個新的字串,是該字串的子字串

    String substring(int beginIndex,int endIndex)

    左閉右開

  24. String toLowerCase()

    使用預設語言環境的規則將此String中的所有字元都轉化為小寫。

    String toUpperCase()

    使用預設語言環境的規則將此String中的所有字元都轉換為大寫。

  25. String trim()

    返回字串的副本,忽略簽到空白和尾部空白

    \t\r\n\r--都屬於空白

    只能去掉頭部和尾部的空白,中間的去不掉

  26. Static String valueOf(boolean b)

    返回boolean引數的字串表示形式

    Static String valueOf(char[] obj)

    返回char陣列引數的字串表示形式 ,本質上呼叫了String中引數為字元陣列的構造方法

    Static String valueOf(Object obj)

    返回Object引數的字串表示形式,對於資料型別除字元陣列之外,其他的都是預設呼叫該引用資料型別的toString方法。

  27. String toString()

    返回此物件本身(已經是一個字串)

  28. boolean matches(String regex)

    告知此字串是否匹配給定的正則表示式

  29. String replaceAll(String regex,String replacement)

    使用給定的replacement替換此字串中所有匹配正則表示式的子字串

    String replaceFirst(String regex,String replacement)

  30. String[] split(String regex)

    根據給定正則表示式的匹配拆分此字串。

五. String和StringBuffer和StringBuilder


  1. String

    由於value陣列被final修飾,String的值是不可變的,這就導致每次對String的操作都會生成新的String物件,不僅效率低下,而且浪費大量優先的記憶體空間。

    不存在擴容

  2. StringBuilder

    可變類,速度更快,但是執行緒不安全

    預設大小16,存在擴容問題

  3. StringBuffer

    StringBuffer是可變類,和執行緒安全的字串操作類,任何對它指向的字串的操作都不會產生新的物件。每個StringBuffer物件都有一定的緩衝區容量,當字串大小沒有超過容量時,不會分配新的容量,當字串大小超過容量時,會自動增加容量 。

    與StringBuilder相似,只在大多方法上加了Synchronized。