#String解析及其方法 1.[前言](#jump1) 2.[什麼是字元串(String)](#jump2) 3.[字元串(String)的兩種創建方式及其區別](#jump3) 4.[字元串(String)的方法及其部分原碼解析](#jump4) 5.[字元串(String)的弊端](#jump ...
String解析及其方法
1.前言
2.什麼是字元串(String)
3.字元串(String)的兩種創建方式及其區別
4.字元串(String)的方法及其部分原碼解析
5.字元串(String)的弊端
1.前言
String 類代表字元串。Java 程式中的所有字元串字面值(如 "abc" )都作為此類的實例實現。
字元串是常量;它們的值在創建之後不能更改。字元串緩衝區支持可變的字元串。因為 String 對象是不可變的,所以可以共用
2.什麼是字元串(String)
String類表示字元串,在創建之後不能被更改,可用於檢查序列的單個字元,搜索字元串,提取字元串,創建字元串副本並將所有字元串全部轉換為大寫或小寫。
3.字元串(String)的兩種創建方式及其區別
字元串有兩種創建方式,分別為直接賦值和構造方法。
字元串在創建之後便不會被更改,對於字元串內容的操作都會新創建一個字元串對象
1.直接複製
以雙引號內的數據作為字元串存儲的數據
String str="hello world";
2.四種構造方法
1.新建一個空字元串
初始化一個新創建的 String 對象,使其表示一個空字元序列
String str1=new String();
空字元串和null的區別
String str2=new String();
String str3=null;
空字元串和null的值都為空
空字元串表示字元串對象引用的值為空,如上str2的值為空,str1指向字元串的記憶體空間
null表示引用為空,如上str3的引用為空,str3沒有指向任何空間
在實際中作用
對字元串的校驗過程中,要考慮字元串值的兩種"空",既要考慮字元串引用對象值是否為空,又要考慮引用對象是否為空
2.新建String的字元串
初始化一個新創建的 String 對象,使其表示一個與參數相同的字元序列;換句話說,新創建的字元串是該參數字元串的副本
String str4=new String("hello world");
生成的str4是對應參數字元串的副本,但str4是對應新創建的對象
3.新建字元數組的字元串,輸出時會自動將數組拼接成字元串
分配一個新的 String,使其表示字元數組參數中當前包含的字元序列
char[] chars={'a','b','c'};
String str5=new String(chars);
適用場景:用於改變字元串的數據
由於字元串在創建之後不能被修改,而字元串沒有相應的改變字元串的方法,但是由獲取對應索引的數據和將數據轉化為字元數組的形式,通過該構造方法可以將字元串的數據進行修改
4.新建位元組數組的字元串,輸出時會自動將數組拼接成字元串
通過使用平臺的預設字元集解碼指定的 byte 數組,構造一個新的 String
byte[] bytes={97,98,99};
String str6=new String(bytes);
使用場景:用於網路中的數據傳輸,將位元組信息轉化為字元串時使用
網路中的數據是位元組類型,通過該方法可以將位元組信息轉化為字元串形式再進行處理
3.兩者的區別
1.存儲
直接賦值:直接賦值進入棧記憶體中,會進入堆記憶體的串池中查看是否有相同地址的數據,沒有便創建,有的話便復用
構造方法:每new一次便會在堆記憶體中開闢一個新的空間,生成新對象,不同對象的地址不同
2.字元串的對比
結果為
== 用於比較地址是否相等,equals用於比較具體的值
4.字元串(String)的方法及其部分原碼解析
1. boolean equals(Object anObject)
給定對象表示的 String 與此 String 相等,則返回 true;否則返回 false
源碼解釋
public boolean equals(Object anObject) {
//比較當前對象(this)與給定對象(anObject)的地址是否相等
if (this == anObject) {
return true;
}
//判斷anObject是否是String的實例
if (anObject instanceof String) {
//將anObject強制轉化為String
String anotherString = (String)anObject;
//獲取當前對象對應的字元數據的長度
int n = value.length;
//判斷n與給定對象對應的字元數組的長度是否相等
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
//比較字元數組對應位置的數據是否相等
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
2.char charAt(int index)
返回指定索引處的 char 值。索引範圍為從 0 到 length() - 1。序列的第一個 char 值位於索引 0 處,第二個位於索引 1 處,依此類推,這類似於數組索引
public char charAt(int index) {
//判斷index是否在給定的索引範圍之內,若不在則拋出字元串角標越界
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
//如果在對應的範圍內,則獲取對應的字元數組對應縮影的數據
return value[index];
}
3.public int length()
返回此字元串的長度
public int length() {
//返回對應對象字元數組的長度
return value.length;
}
4.public String concat(String str)
將指定字元串連接到此字元串的結尾。
如果參數字元串的長度為 0,則返回此 String 對象。否則,創建一個新的 String 對象,用來表示由此 String 對象表示的字元序列和參數字元串表示的字元序列連接而成的字元序列
public String concat(String str) {
//判斷str是否為空
if (str.isEmpty()) {
return this;
}
int len = value.length;
int otherLen = str.length();
//複製當前對象的值,並指定長度為len+otherLen
char buf[] = Arrays.copyOf(value, len + otherLen);
//將str的值添加到buf之後,getChars()的底層是System的arraycopy()
str.getChars(buf, len);
return new String(buf, true);
}
通常使用"+",和concat()的底層原理是一樣
5.public String substring(int beginIndex,int endIndex)
返回一個新字元串,它是此字元串的一個子字元串。該子字元串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字元。因此,該子字元串的長度為 endIndex-beginIndex
public String substring(int beginIndex, int endIndex) {
//判斷給定的起始索引和終止索引是否符合要求
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
//判斷終止索引是否大於起始索引
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
//判斷起始索引和終止索引是否對應於字元串對應的字元數組的起始位置和終止位置,如果是,便返回對應的字元串,否則便返回索引的數據
return ((beginIndex == 0) && (endIndex == value.length)) ? this: new String(value, beginIndex, subLen);
}
方法的重載
public String substring(int beginIndex)
返回一個新的字元串,它是此字元串的一個子字元串。該子字元串從指定索引處的字元開始,直到此字元串末尾。
6.public String replace(char oldChar,char newChar)
返回一個新的字元串,它是通過用 newChar 替換此字元串中出現的所有 oldChar 得到的。
如果 oldChar 在此 String 對象表示的字元序列中沒有出現,則返回對此 String 對象的引用。否則,創建一個新的 String 對象,它所表示的字元序列除了所有的 oldChar 都被替換為 newChar 之外,與此 String 對象表示的字元序列相同
public String replace(CharSequence target, CharSequence replacement) {
//運用正則表達式對字元串進行替換
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
5.字元串(String)的弊端
由於字元串一旦創建後便不能更改,因此在進行字元串的拼接過程中,會不斷產生新的對象,對於記憶體的消耗大,同時,進行字元串的反轉,過程複雜,記憶體的消耗大,因此需要其他的字元串類