1. String
String被稱為字符串常量贷币,一旦賦值后值不可概念,可以通過修改內(nèi)存指向重新賦值
== 在字符串中比較的是內(nèi)存地址
如果想比較兩個字符串的內(nèi)容是否一致需要使用"equals"方法
上述圖片中的代碼亏狰,在使用equals比較后役纹,結(jié)果都是true
s1.equals(s2); 結(jié)果為true
s3.equals(s4); 結(jié)果為true
...
面試題/筆試題: String中==比較的是什么?equals比較的是什么暇唾?
答案:==比較的是內(nèi)存地址是否一致促脉,equals比較的是字符串中內(nèi)容是否一致
2. String的API
2.1 構(gòu)造方法
- String();
創(chuàng)建一個表示空字符串("") 的String對象。更多的時候使用的方式
String str = "";
空字符串不代表null策州,null是指棧中數(shù)據(jù)是null瘸味,空字符串指的是堆中的字符串沒有賦值
String(byte[] bytes);
構(gòu)造一個新的 String通過解碼的字節(jié)數(shù)組指定使用平臺的默認字符集。(可以理解為利用ASC碼的數(shù)組構(gòu)建一個字符串)
String(char[] value)
分配一個新的 String所以它代表當前字符序列中包含的字符數(shù)組參數(shù)够挂。(可以理解為將字符數(shù)組中所有字符拼成一個字符串)
String(String org)
初始化一個新創(chuàng)建的 String對象,所以它代表了相同的字符序列作為參數(shù);換句話說,新創(chuàng)建的字符串參數(shù)字符串的副本旁仿。
String str = new String("哈哈");
String str = "哈哈";
String(StringBuffer sb)和String(StringBuilder sb)
分配一個新的字符串,它包含當前字符序列中包含字符串緩沖區(qū)的字符數(shù)據(jù)(可以理解為將StringBuffer或StringBuilder轉(zhuǎn)換成String)
更多的是使用StringBuffer和StringBuilder的toString()方法來完成轉(zhuǎn)換String(byte[] b, String charset)
通過charset字符集解碼byte數(shù)組完成字符串的構(gòu)建(一般用于字符串在不同字符集之間的轉(zhuǎn)換)
String(char[] value, int offset, int count)
在value數(shù)組中的offset位置起,使用count個元素構(gòu)建字符串
char[] c2 = {'你','好','啊','我','還','行','哈','哈'};
String s6 = new String(c2, 3, 3);
System.out.println(s6);
運行結(jié)果:“我還行”
更多的構(gòu)造方法孽糖,請參照API文檔
2.2 API方法
2.2.1 charAt(int idx) 返回值: char
返回字符串中idx位置上的字符枯冈。比如毅贮,得到字符串的首字符
String str = "abc";
char c = str.charAt(0);
c得到的字符是'a',字符串的本質(zhì)上是一個字符數(shù)組尘奏,注意不要下標越界滩褥。
2.2.2 equals(String str) 返回值:boolean
判斷字符串與目標字符串str中的內(nèi)容是否一致
String s1 = new String("haha");
String s2 = new String("haha");
String s3 = new String("Haha");
boolean b1 = s1.equals(s2);
boolean b2 = s1.equals(s3);
b1的結(jié)果是true,b2的結(jié)果是false
2.2.3 equalsIgnoreCase(String str) 返回值:boolean
判斷字符串與目標字符串str中的內(nèi)容是否一致罪既,忽略大小寫
String s1 = new String("haha");
String s2 = new String("haha");
String s3 = new String("Haha");
boolean b1 = s1.equalsIgnoreCase(s2);
boolean b2 = s1.equalsIgnoreCase(s3);
b1的結(jié)果是true铸题,b2的結(jié)果是true
2.2.4 getBytes() 返回值:byte[]
和toCharArray() 返回值:char[]
getBytes() 返回一個由各個字符拆分成ASC碼的byte數(shù)組
toCharArray() 返回一個由各個字符拆分成的char數(shù)組
2.2.5 indexOf(String s) 返回值:int
和lastIndexOf(String s)返回值:int
indexOf(String s) 返回參數(shù)s在字符串中第一次出現(xiàn)的位置,如果沒有出現(xiàn)過返回-1
lastIndexOf(String s) 返回參數(shù)s在字符串中最后一次出現(xiàn)的位置琢感,如果沒有出現(xiàn)過返回-1
String str2 = "I LIKE GIRL";
int i1 = str2.indexOf("I");
int i2 = str2.lastIndexOf("I");
int i3 = str2.indexOf("i");
int i4 = str2.indexOf("LIKE");
結(jié)果:i1的結(jié)果0丢间,i2的結(jié)果是8,i3的結(jié)果是-1驹针,i4的結(jié)果是2
2.2.6 isEmpty() 返回值:boolean
判斷當前字符串是否為空字符串烘挫,相當于代碼equals("")
一般用于檢測字符串變量是否有值
String str3 = null;
if(str3 == null || str3.isEmpty()) {
System.out.println("請輸入內(nèi)容");
}
此處利用了||的短路特征,先判斷是否為null柬甥,如果str3是null饮六,此處短路越過判斷isEmpty,程序正常執(zhí)行苛蒲。如果反過來寫卤橄,先判斷isEmpty,當str3為null時會發(fā)生空指針異常
2.2.7 length()返回值:int
返回字符串中字符的個數(shù)臂外,無論什么字符(英文窟扑,數(shù)字,漢字漏健,標點嚎货,空格)都算1個。
String str2 = "I LIKE GIRL";
String str4 = "哈哈 哈,呵呵";
int l1 = str2.length();
int l2 = str4.length();
l1的值是11蔫浆,l2的值是7
2.2.8 replaceAll(String s, String t) 返回值:String
在源字符串中殖属,使用字符串t替代所有的子字符串s,并返回替代后的字符串
示例:將源字符串str5中的所有字符A替換為*
String str5 = "ABDFAKADOABASDALOI";
String str6 = str5.replaceAll("A", "*");
System.out.println(str6);
str6結(jié)果:*BDF*K*DO*B*SD*LOI
2.2.9 split(String s)返回值:String[]
將源字符串瓦盛,利用s(正則表達式)作為分隔符洗显,將字符串拆分為字符串數(shù)組
String str7 = "A,B,C,11,2,SS,HAH啊,哈哈哈";
String[] sts = str7.split(",");
System.out.println(sts.length);
for(int i = 0; i < sts.length; i++) {
System.out.print(sts[i]);
System.out.print("\t");
}
System.out.println();
結(jié)果:長度是8,數(shù)組中是拆分后的結(jié)果
2.2.10 substring(int start)和substring(int start, int end) 返回值:String
substring(int start):從下標start位置起(含start)原环,截取字符串至結(jié)尾
substring(int start, int end) :從下標start位置起(含start)墙懂,截取至下標end位置(不含end) [start,end)
String str8 = "I LIKE GIRL";
String str9 = str8.substring(2);//[2,]
String str10 = str8.substring(2,6);//[2,6)
System.out.println(str9);
System.out.println(str10);
str9的結(jié)果是:LIKE GIRL
str10的結(jié)果是:LIKE
2.2.11 toLowerCase()和toUpperCase() 返回值:String
toLowerCase(): 將字符串的所有字符變更為小寫
toUpperCase(): 將字符串的所有字符變更為大寫
String str11 = "I Like Girl";
String str12 = str11.toLowerCase();
String str13 = str11.toUpperCase();
System.out.println(str12);
System.out.println(str13);
str12的結(jié)果是i like girl
str13的結(jié)果是I LIKE GIRL
2.2.12 trim() 返回值:String
去掉字符串兩端多余的空格,并返回去掉空格的結(jié)果
String str14 = " adm in ";
System.out.println(str14.length());
String str15 = str14.trim();
System.out.println(str15.length());
System.out.println(str15);
str15的結(jié)果是:adm in
更多的API方法扮念,請參照API文檔
3. StringBuffer和StringBuilder
StringBuffer被稱為字符串變量损搬,線程安全的。主要用途是在字符串拼接時,提升程序的運行效率
StringBuilder被稱為字符串變量巧勤,線程不安全的嵌灰。主要用途是在字符串拼接時,進一步提升程序的運行效率
public class Test {
public static void main(String[] args) {
String str = ""; //不是null
long l1 = System.currentTimeMillis();
for(int i = 1; i < 40000; i++) {
str += i;
}
long l2 = System.currentTimeMillis();
System.out.println("耗時:"+(l2-l1)+"ms");
StringBuffer sb1 = new StringBuffer();
long l3 = System.currentTimeMillis();
for(int i = 1; i < 10000000; i++) {
sb1.append(i);
}
long l4 = System.currentTimeMillis();
System.out.println("耗時:"+(l4-l3)+"ms");
StringBuilder sb2 = new StringBuilder();
long l5 = System.currentTimeMillis();
for(int i = 1; i < 10000000; i++) {
sb2.append(i);
}
long l6 = System.currentTimeMillis();
System.out.println("耗時:"+(l6-l5)+"ms");
}
}
運行結(jié)果
面試題和筆試題
(1) ==和equals的區(qū)別颅悉?
==是比較內(nèi)存地址沽瞭,equals比較的是字符串內(nèi)容
(2) 程序的運行結(jié)果
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
str1 == str2?
str1 == str3?
(3) String,StringBuffer和StringBuilder的區(qū)別
String是字符串常量剩瓶,值不能修改驹溃,新賦值重新修改內(nèi)存指向
StringBuffer和StringBuilder是字符串變量,拼接效率比String高延曙。其中StringBuffer是線程安全的豌鹤,效率低于StringBuilder(線程不安全的)