String相關
一. 概述
-
String為引用資料型別,是一個工具類,在java.long包中。宣告如下:
public final class String extends Object
注:final修飾表示不能繼承
-
關於字面值(直接量)
- 數值型字面值:整數 浮點數
- 字元型字面值:字元'a'
- 布林型字面值:true false
- 字串字面值:“abc”//可以為空
注:java程式中所有用到的字面值,都是String的例項
-
字串是常量:引用不能發生改變
-
String 引用=字串字面值
-
String 引用=new String(“字面值”)
-
-
底層
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")
【注】
-
string s1="abc";string s2="abc";
在堆中只建立了一個物件
-
String s1=new String(“abc”);String s2=new String("abc")
在堆中建立了兩個物件
-
String s1=“ab”;String s2=‘a’+‘b’
同地址。因為字串的字面值,java編譯會進行優化,編譯後為:string s2="ab"
-
String s="ab";String s1="a";String s2=s1+"b";Sout(s==s2)//false
1.與③對比,s1不是字面值,無法優化編譯
2.頂層返回新的地址空間
三. 構造方法
-
String()
初始化一個新物件,表示一個空字元序列
-
String(Char[] value)
分配一個新的String,使其表示字元陣列引數中當前包含的字元序列;將字元陣列轉化為字串
-
String(char[] value,int offset,int count)
分配一個新的String,包含取自字元陣列的一個子陣列。其中:
Int offset:起始的下標
Int count:個數
將字元陣列中部分字元轉為字串
-
String(byte[] bytes)
通過使用平臺的預設字符集解碼指定的byte陣列,構建一個新的String
-
String(byte[] bytes,String charsetName)
通過使用指定的charset解碼指定的byte陣列,構造一個新的String
四. String 常用方法
-
char charAt(int index)
返回指定索引處的char值,小心越界異常
-
int length()
返回字串長度
-
char[] toCharArray()
將字串轉成一個新的字元陣列,修改字元陣列的元素的值不會影響原字串的內容;
-
int compareTo(String anotherString)
按字典順序比較
-
獲取兩個字串長度最小的值,在此範圍內依下標比較
-
如果相等則比較下一位,否則返回當前字元-引數字元
-
長度範圍內都相等,最後返回當前字串長度-引數字串長度
總結:返回0:相等;負數:當前小;正數:當前大
-
-
Int compare TolgonreCase(String str)
不分大小寫進行字典序比較
-
String concat(String s1)
將指定字串連線到此字串的結尾
效率比+高,但高不到哪裡去,一般情況下用+就行了
-
boolean contains(CharSequence s)
當且僅當字串中包含指定的char值序列時,返回true。
注:CharSequnce是個介面,String已經預設實現了,這裡也是向上造型
-
boolean endsWith(String suffix)
測試此字串是否以指定的字尾結束
應用場景:根據字尾判斷檔案型別
-
boolean startsWith(String prefix)
測試此字串是否以指定的字首開始
-
boolean startsWith(String prefix,int toffset)
測試此字串從指定索引開始的字串是否以指定字首開始
-
int infexOf(int ch)
返回指定字元在此字串中第一次出現的索引
從0開始,如果沒有則返回-1
-
Int indexOf(int ch,int fromIndex)
返回在此字串中第一次出現指定字元處的索引,從指定的索引開始搜尋,沒有則返回-1
-
Int indexOf(String str)
返回指定子字串在此字串中第一次出現處的索引
-
Int indexOf(String str,int fromIndex)
返回指定字串在此字串中第一次出現處的索引。從指定的索引開始
-
Int lastIndexOf(int ch)
Int lastIndexOf(int ch,int fromIndex)
Int lastIndexOf(String str)
Int lastIndexOf(String str,int fromIndex)
-
Boolean equals(Object anObject)
將此字串與指定的物件比較
String重寫了equals方法
-
Boolean equalsIgnoreCase(string anotherString)
-
byte[] getBytes()
使用平臺的預設字符集將此String 編碼為byte(二進位制)序列,並將結果儲存到一個新的byte陣列中
字元轉二進位制:將字元對映到整數碼
碼錶不同,中文所佔位元組數不同
GBK:1個字元佔2個位元組
Utf-8:一個字元佔3個位元組
注意:Idea中預設所有專案的編碼都是UTF-8
eclipse中預設的編碼和平臺便把一致--GBK
-
byte[] getBytes(String charsetName)
使用指定的字符集將此String編碼為byte(二進位制)序列,並將結果儲存到一個新的byte陣列中
-
int hashCode()
返回此字串的雜湊碼
\(S[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]*31^0\)
空字串的雜湊值為0
-
boolean isEmpty()
當且僅當length()為0時返回true
-
String replace(Char target,Char replacement)
String replace(CharSequence target,CharSequence replacement)
使用指定的字面值序列,替換此字串中所有匹配的的字面值
-
String substring(int beginIndex)
返回一個新的字串,是該字串的子字串
String substring(int beginIndex,int endIndex)
左閉右開
-
String toLowerCase()
使用預設語言環境的規則將此String中的所有字元都轉化為小寫。
String toUpperCase()
使用預設語言環境的規則將此String中的所有字元都轉換為大寫。
-
String trim()
返回字串的副本,忽略簽到空白和尾部空白
\t\r\n\r--都屬於空白
只能去掉頭部和尾部的空白,中間的去不掉
-
Static String valueOf(boolean b)
返回boolean引數的字串表示形式
Static String valueOf(char[] obj)
返回char陣列引數的字串表示形式 ,本質上呼叫了String中引數為字元陣列的構造方法
Static String valueOf(Object obj)
返回Object引數的字串表示形式,對於資料型別除字元陣列之外,其他的都是預設呼叫該引用資料型別的toString方法。
-
String toString()
返回此物件本身(已經是一個字串)
-
boolean matches(String regex)
告知此字串是否匹配給定的正則表示式
-
String replaceAll(String regex,String replacement)
使用給定的replacement替換此字串中所有匹配正則表示式的子字串
String replaceFirst(String regex,String replacement)
-
String[] split(String regex)
根據給定正則表示式的匹配拆分此字串。
五. String和StringBuffer和StringBuilder
-
String
由於value陣列被final修飾,String的值是不可變的,這就導致每次對String的操作都會生成新的String物件,不僅效率低下,而且浪費大量優先的記憶體空間。
不存在擴容
-
StringBuilder
可變類,速度更快,但是執行緒不安全
預設大小16,存在擴容問題
-
StringBuffer
StringBuffer是可變類,和執行緒安全的字串操作類,任何對它指向的字串的操作都不會產生新的物件。每個StringBuffer物件都有一定的緩衝區容量,當字串大小沒有超過容量時,不會分配新的容量,當字串大小超過容量時,會自動增加容量 。
與StringBuilder相似,只在大多方法上加了Synchronized。