1、String
1.1 String 實(shí)例化
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底層實(shí)現(xiàn) private final char value[];
String底層是由 私有final 的數(shù)組實(shí)現(xiàn)的,對(duì)外沒有提供修改的方法,字符串多次賦值,不是修改字符串的內(nèi)容,而是 改變字符串的引用地址 ;
源碼
1.2 String常用方法
方法 | 說明 |
length() | 字符串的長(zhǎng)度 |
equals() | 比較的是字符串的內(nèi)容 |
equalsIgnoreCase(String str) | 忽略大小比較 |
toUpperCase() | 轉(zhuǎn)大寫 |
toLowerCase() | 轉(zhuǎn)小寫 |
concat(String str) | 返回拼接后的字符串 |
length()
字符串的長(zhǎng)度:length()方法,返回的是字符串的長(zhǎng)度,即字符串的長(zhǎng)度(不是字節(jié)數(shù)),區(qū)別去數(shù)組的length
String string1 = “hello KH96”;System.out.println(string1+”的長(zhǎng)度:”+string1.length()); //hello KH96的長(zhǎng)度:10
equals()
重寫了Object類的equals方法,比較的是字符串的內(nèi)容,不是對(duì)象
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)); //falseSystem.out.println(“忽略大小寫比:”+string7.equalsIgnoreCase(string8)); //true
toUpperCase() 轉(zhuǎn)大寫 toLowerCase() 轉(zhuǎn)小寫
String string9 = “abCD”;System.out.println(string9.toUpperCase()); //ABCDSystem.out.println(string9.toLowerCase());//abcd
concat(String str) 返回拼接后的字符串
“+”號(hào)也可以進(jìn)行字符串拼接
concat(String str)
拼接字符串都創(chuàng)建了新的對(duì)象,在循環(huán)中盡量不要拼接字符串,會(huì)造成棧溢出;
String strig10 = “abc”;System.out.println(strig10.concat(“bcd”).concat(“def”));//abcbcddef
1.3 String 字符查找/提取相關(guān)方法
方法 | 說明 |
indexOf(String str) | 返回str首次出現(xiàn)的下標(biāo) |
lastIndexOf(String str) | 返回str最后一次出現(xiàn)的下標(biāo) |
substring(int index1) | 截取下標(biāo)index1,及以后的所有字符 |
substring(int index1,int index2) | 截取下標(biāo)index1到index2之間的字符串,包括index1, 不包括 index2 |
trim() | 去除字符串的 首尾 空格 |
startsWith(String str) | 是否以str開頭 |
endsWith(String str) | 是否以str結(jié)尾 |
contains(String str) | 是否包含str |
split(String str) | 根據(jù)指定分割字符,將字符串拆分成字符串?dāng)?shù)組返回 |
toCharArray() | 將字符串轉(zhuǎn)為字符數(shù)組 |
replace(String str1,String str2) | 用 str2 替換 str1 |
getBytes() | 字符串轉(zhuǎn)換為字節(jié)數(shù)組 |
getBytes(“UTF-8”) | 字符串轉(zhuǎn)換為字節(jié)數(shù)組,可指定編碼 |
new String(byte[] bytes) | 將字節(jié)數(shù)組轉(zhuǎn)換為字符串 |
indexOf(String str)
返回str首次出現(xiàn)的下標(biāo),沒有查到就返回-1
String string11 = “I am a good student in kh96”;System.out.println(“good首次出現(xiàn)的位置:”+string11.indexOf(“good”)); //7
還可以通過ascii碼值查詢
String string11 = “I am a good student in kh96”;char char1 = 97;System.out.println(char1); //aSystem.out.println(“參數(shù)支持int assic碼值:”+string11.indexOf(97)); //2
lastIndexOf(String str)
返回str最后一次出現(xiàn)的下標(biāo),沒有就返回-1
String string11 = “I am a good student in kh96”;System.out.println(string11);System.out.println(“t最后一次出現(xiàn)的下標(biāo):”+string11.lastIndexOf(“t”)); //18
substring(int index1)
截取下標(biāo)index1,及以后的所有字符
index的范圍[0,string.length()]
String string12 = “abcdefghijklmn”;System.out.println(string12.substring(5)); //fghijklmn
substring(int index1,int index2)
截取下標(biāo)index1到index2之間的字符串,包括index1, 不包括 index2
index的范圍[0,string.length()]
String string12 = “abcdefghijklmn”;System.out.println(string12.substring(5,8)); //fgh
小應(yīng)用
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(“原始長(zhǎng)度”+string13.length()); //10System.out.println(“取出空格后長(zhǎng)度”+string13.trim().length()); //6 “KH 96”
startsWith(String str) endsWith(String str)
startsWith(String str) 是否以str開頭
endsWith(String str) 是否以str結(jié)尾
String string15 = “KH96.mp3”;System.out.println(“是否是KH開頭?”+ string15.startsWith(“KH”)); //trueSystem.out.println(“是否是.mp3結(jié)尾?”+ string15.endsWith(“.mp3”)); //true
contains(String str)
判斷字符串是否包含str
String string16 = “aaa bbb cc ddd”;System.out.println(“是否包含bbb:”+ string16.contains(“bbb”)); //trueSystem.out.println(“是否包含eee:”+ string16.contains(“eee”)); //false
split(String str)
根據(jù)指定分割字符,將字符串拆分成字符串?dāng)?shù)組返回
String string17_1 = “13501020304;15801020304;18901020304”;String[] phoneNumbers1 = string17_1.split(“;”); //一種字符分割System.out.println(“手機(jī)號(hào)數(shù)組內(nèi)容:”+ Arrays.toString(phoneNumbers2));String string17_2 = “13501020304;15801020304!18901020304”;String[] phoneNumbers2 = string17_2.split(“;|!”); //多種字符分割 用 | 隔開System.out.println(“手機(jī)號(hào)數(shù)組內(nèi)容:”+ Arrays.toString(phoneNumbers2));//[13501020304, 15801020304, 18901020304]
toCharArray()
將字符串轉(zhuǎn)為字符數(shù)組
char[] chars1 = string18.toCharArray();System.out.println(Arrays.toString(chars1)); //[K, H, 9, 8, 正, 在, 學(xué), 習(xí), 實(shí), 用, 類]
replace(String str1,String str2)
用 str2 替換 str1
//獲取一個(gè)16位的隨機(jī)字符串 String string19 = UUID.randomUUID().toString();System.out.println(string19); //65c0844a-c437-4a65-89ca-84d4166325ff//轉(zhuǎn)換字符串,將-轉(zhuǎn)換為*System.out.println(string19.replace(“-“,”*”));//65c0844a*c437*4a65*89ca*84d4166325ff//去除字符串,將所有的-去除System.out.println(string19.replace(“-“,””));//65c0844ac4374a6589ca84d4166325ff//去16位隨機(jī)數(shù)System.out.println(string19.replace(“-“,””).substring(0,16));//65c0844ac4374a65
getBytes() getBytes(“UTF-8”)
字符串轉(zhuǎn)換為字節(jié)數(shù)組
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)
將字節(jié)數(shù)組轉(zhuǎn)換為字符串
byte[] bytes3 ={100,101,102}; //ascii碼值System.out.println(new String(bytes3)); //def//配合上面getBytes進(jìn)行轉(zhuǎn)碼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類:可以實(shí)現(xiàn)動(dòng)態(tài)拼接字符串,而不會(huì)創(chuàng)建新的對(duì)象;
即:是一個(gè)可變字符串的對(duì)象,改變的是字符串對(duì)象中的內(nèi)容;
不可以直接賦值,必須通過new創(chuàng)建對(duì)象;
2.1 StringBuffer實(shí)例化
new StringBuffer()
默認(rèn)初始容量 16
StringBuffer sbf1 = new StringBuffer();System.out.println(“默認(rèn)初始容量:”+sbf1.capacity());//16
底層實(shí)現(xiàn)
//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
底層實(shí)現(xiàn)
public StringBuffer(int capacity) {super(capacity); //指定初始容量}
StringBuffer(String str)
指定初始字符串,容量為字符串長(zhǎng)度+16
StringBuffer sbf3 = new StringBuffer(“Kh96”);System.out.println(“指定初始字符串初始容量:”+sbf3.capacity()); //20
底層實(shí)現(xiàn)
public StringBuffer(String str) { super(str.length() + 16); //容量為字符串長(zhǎng)度+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
擴(kuò)容機(jī)制
底層擴(kuò)容,當(dāng)拼接一個(gè)新的字符串,字符串?dāng)?shù)組長(zhǎng)度不夠,會(huì)進(jìn)行動(dòng)態(tài)擴(kuò)容,
每次擴(kuò)容都是前一個(gè)數(shù)組長(zhǎng)度的2倍+2
最大擴(kuò)容長(zhǎng)度不能超過Integer的最大值 – 8;
void expandCapacity(int minimumCapacity) { int newCapacity = value.length * 2 + 2; //每次擴(kuò)容都是前一個(gè)數(shù)組長(zhǎng)度的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()
獲取動(dòng)態(tài)字符串內(nèi)容
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沒有區(qū)別,唯一的區(qū)別就是StringBuffer是 線程安全的 ,StringBuilder是 非線程安全的 ;