Java使用類-String

化羽羽 發表於 2022-06-16
Java

大佬的理解->《深入理解Java中的String》

1、String

1.1 String 例項化

String str1 = "xxx";

String string1 = "hello KH96";
System.out.println(string1); //hello KH96

String str1 = new String("xxx");

String string2 = "hello KH96";
System.out.println(string2); //hello KH96

String底層實現 private final char value[];

​ String底層是由私有final的陣列實現的,對外沒有提供修改的方法,字串多次賦值,不是修改字串的內容,而是改變字串的引用地址

原始碼

Java使用類-String

1.2 String常用方法

方法 說明
length() 字串的長度
equals() 比較的是字串的內容
equalsIgnoreCase(String str) 忽略大小比較
toUpperCase() 轉大寫
toLowerCase() 轉小寫
concat(String str) 返回拼接後的字串

length()

字串的長度:length()方法,返回的是字串的長度,即字串的長度(不是位元組數),區別去陣列的length

String string1 = "hello KH96";
System.out.println(string1+"的長度:"+string1.length()); //hello KH96的長度:10

equals()

重寫了Object類的equals方法,比較的是字串的內容,不是物件

String string2 = "KH96";
String string3 = "KH97";
System.out.println(string2.equals(string3)); //false

equalsIgnoreCase(String str)

忽略大小比較

String string7 = "kh96";
String string8 = "KH96";
System.out.println("不忽略大小寫比較:"+string7.equals(string8)); //false
System.out.println("忽略大小寫比:"+string7.equalsIgnoreCase(string8)); //true

toUpperCase() 轉大寫 toLowerCase() 轉小寫

String string9 = "abCD";
System.out.println(string9.toUpperCase()); //ABCD
System.out.println(string9.toLowerCase());//abcd

concat(String str) 返回拼接後的字串

"+"號也可以進行字串拼接

concat(String str)

拼接字串都建立了新的物件,在迴圈中儘量不要拼接字串,會造成棧溢位;

String strig10 = "abc";
System.out.println(strig10.concat("bcd").concat("def"));//abcbcddef

1.3 String 字元查詢/提取相關方法

方法 說明
indexOf(String str) 返回str首次出現的下標
lastIndexOf(String str) 返回str最後一次出現的下標
substring(int index1) 擷取下標index1,及以後的所有字元
substring(int index1,int index2) 擷取下標index1到index2之間的字串,包括index1,不包括index2
trim() 去除字串的首尾空格
startsWith(String str) 是否以str開頭
endsWith(String str) 是否以str結尾
contains(String str) 是否包含str
split(String str) 根據指定分割字元,將字串拆分成字串陣列返回
toCharArray() 將字串轉為字元陣列
replace(String str1,String str2) 用 str2 替換 str1
getBytes() 字串轉換為位元組陣列
getBytes("UTF-8") 字串轉換為位元組陣列,可指定編碼
new String(byte[] bytes) 將位元組陣列轉換為字串

indexOf(String str)

返回str首次出現的下標,沒有查到就返回-1

String string11 = "I am a good student in kh96";
System.out.println("good首次出現的位置:"+string11.indexOf("good")); //7

還可以通過ascii碼值查詢

String string11 = "I am a good student in kh96";
char char1 = 97;
System.out.println(char1); //a
System.out.println("引數支援int assic碼值:"+string11.indexOf(97)); //2

lastIndexOf(String str)

返回str最後一次出現的下標,沒有就返回-1

String string11 = "I am a good student in kh96";
System.out.println(string11);
System.out.println("t最後一次出現的下標:"+string11.lastIndexOf("t")); //18

substring(int index1)

擷取下標index1,及以後的所有字元

index的範圍[0,string.length()]

String string12 = "abcdefghijklmn";
System.out.println(string12.substring(5)); //fghijklmn

substring(int index1,int index2)

擷取下標index1到index2之間的字串,包括index1,不包括index2

index的範圍[0,string.length()]

String string12 = "abcdefghijklmn";
System.out.println(string12.substring(5,8)); //fgh

小應用

String string14 = "KH90,KH91,KH92,KH93,KH94,KH95,";
System.out.println(string14.substring(0,string14.lastIndexOf(",")));//KH90,KH91,KH92,KH93,KH94,KH95

trim()

去除字串的首尾空格

String string13 = "  KH  96  ";
System.out.println("原始長度"+string13.length()); //10
System.out.println("取出空格後長度"+string13.trim().length()); //6 "KH  96"

startsWith(String str) endsWith(String str)

startsWith(String str) 是否以str開頭

endsWith(String str) 是否以str結尾

String string15 = "KH96.mp3";
System.out.println("是否是KH開頭?"+ string15.startsWith("KH")); //true
System.out.println("是否是.mp3結尾?"+ string15.endsWith(".mp3")); //true

contains(String str)

判斷字串是否包含str

String string16 = "aaa bbb cc ddd";
System.out.println("是否包含bbb:"+ string16.contains("bbb")); //true
System.out.println("是否包含eee:"+ string16.contains("eee")); //false

split(String str)

根據指定分割字元,將字串拆分成字串陣列返回

String string17_1 = "13501020304;15801020304;18901020304";
String[] phoneNumbers1 = string17_1.split(";"); //一種字元分割
System.out.println("手機號陣列內容:"+ Arrays.toString(phoneNumbers2));

String string17_2 = "13501020304;15801020304!18901020304";
String[] phoneNumbers2 = string17_2.split(";|!"); //多種字元分割 用 | 隔開
System.out.println("手機號陣列內容:"+ Arrays.toString(phoneNumbers2));
//[13501020304, 15801020304, 18901020304]

toCharArray()

將字串轉為字元陣列

char[] chars1 = string18.toCharArray();
System.out.println(Arrays.toString(chars1)); //[K, H, 9, 8, 正, 在, 學, 習, 實, 用, 類]

replace(String str1,String str2)

用 str2 替換 str1

//獲取一個16位的隨機字串
 String string19 = UUID.randomUUID().toString();
System.out.println(string19); //65c0844a-c437-4a65-89ca-84d4166325ff

//轉換字串,將-轉換為*
System.out.println(string19.replace("-","*"));//65c0844a*c437*4a65*89ca*84d4166325ff
//去除字串,將所有的-去除
System.out.println(string19.replace("-",""));//65c0844ac4374a6589ca84d4166325ff
//去16位隨機數
System.out.println(string19.replace("-","").substring(0,16));//65c0844ac4374a65

getBytes() getBytes("UTF-8")

字串轉換為位元組陣列

String string20 = "abcd";
//getBytes() 沒有指定編碼
byte[] bytes = string20.getBytes(); 
try {
    //getBytes("UTF-8") 指定編碼
    byte[] bytes2 = string20.getBytes("UTF-8");
    System.out.println(Arrays.toString(bytes2)); //[97, 98, 99, 100]
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
System.out.println(Arrays.toString(bytes)); //Arrays.toString(bytes)

new String(byte[] bytes)

將位元組陣列轉換為字串

 byte[] bytes3 ={100,101,102}; //ascii碼值
System.out.println(new String(bytes3)); //def
//配合上面getBytes進行轉碼
try {
    System.out.println(new String(bytes3,"utf-8")); //可以指定編碼 def
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

char[] chars3 = {'K','H','9','6'};
System.out.println(new String(chars3));//KH96

2、StringBuffer

可變字串類:StringBuffer
不同於String類:可以實現動態拼接字串,而不會建立新的物件;
即:是一個可變字串的物件,改變的是字串物件中的內容;
不可以直接賦值,必須通過new建立物件;

2.1 StringBuffer例項化

new StringBuffer()

預設初始容量 16

StringBuffer sbf1 = new StringBuffer();
System.out.println("預設初始容量:"+sbf1.capacity());//16

底層實現

//StringBuffer()
public StringBuffer() {
        super(16); //初始容量16
    }

//AbstractStringBuilder(int capacity)
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}

new StringBuffer(int capacity)

指定初始容量

StringBuffer sbf2 = new StringBuffer(32);
System.out.println("只定始容量:"+sbf2.capacity()); //32

底層實現

public StringBuffer(int capacity) {
	super(capacity); //指定初始容量
}

StringBuffer(String str)

指定初始字串,容量為字串長度+16

StringBuffer sbf3 = new StringBuffer("Kh96");
System.out.println("指定初始字串初始容量:"+sbf3.capacity()); //20

底層實現

public StringBuffer(String str) {
    super(str.length() + 16); //容量為字串長度+16
    append(str);
}

2.2 StringBuffer常用方法

append(String str)

拼接字串

StringBuffer sbf4 = new StringBuffer("userId=");
sbf4.append("U0001")
            .append(",userName=")
            .append("張三,age=")
            .append("18"); //userId=U0001,userName=張三,age=18

擴容機制

底層擴容,當拼接一個新的字串,字串陣列長度不夠,會進行動態擴容,
每次擴容都是前一個陣列長度的2倍+2
最大擴容長度不能超過Integer的最大值 - 8;

void expandCapacity(int minimumCapacity) {
    int newCapacity = value.length * 2 + 2; //每次擴容都是前一個陣列長度的2倍+2
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity);
}

toString()

獲取動態字串內容

StringBuffer sbf4 = new StringBuffer("userId=");
sbf4.append("U0001")
            .append(",userName=")
            .append("張三,age=")
            .append("18");
String userInfo = sbf4.toString();
 System.out.println(userInfo); //userId=U0001,userName=張三,age=18

3、StringBuilder

用法和StringBuffer沒有區別,唯一的區別就是StringBuffer是執行緒安全的,StringBuilder是非執行緒安全的