第13章 字符串類

1. String

String被稱為字符串常量贷币,一旦賦值后值不可概念,可以通過修改內(nèi)存指向重新賦值
== 在字符串中比較的是內(nèi)存地址
如果想比較兩個字符串的內(nèi)容是否一致需要使用"equals"方法

內(nèi)存理解

上述圖片中的代碼亏狰,在使用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é)果


運行結(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é)果


運行結(jié)果
內(nèi)存表示

面試題和筆試題
(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(線程不安全的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枝缔,隨后出現(xiàn)的幾起案子布疙,更是在濱河造成了極大的恐慌,老刑警劉巖愿卸,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵临,死亡現(xiàn)場離奇詭異,居然都是意外死亡趴荸,警方通過查閱死者的電腦和手機儒溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來发钝,“玉大人顿涣,你說我怎么就攤上這事×剑” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵舔痪,是天一觀的道長寓调。 經(jīng)常有香客問我,道長锄码,這世上最難降的妖魔是什么夺英? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮滋捶,結(jié)果婚禮上痛悯,老公的妹妹穿的比我還像新娘。我一直安慰自己重窟,他們只是感情好载萌,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般扭仁。 火紅的嫁衣襯著肌膚如雪垮衷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天乖坠,我揣著相機與錄音搀突,去河邊找鬼。 笑死熊泵,一個胖子當著我的面吹牛仰迁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顽分,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼徐许,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怯邪?” 一聲冷哼從身側(cè)響起绊寻,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悬秉,沒想到半個月后澄步,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡和泌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年村缸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片武氓。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡梯皿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出县恕,到底是詐尸還是另有隱情东羹,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布忠烛,位于F島的核電站属提,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏美尸。R本人自食惡果不足惜冤议,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望师坎。 院中可真熱鬧恕酸,春花似錦、人聲如沸胯陋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寿弱,卻和暖如春犯眠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背症革。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工筐咧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人噪矛。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓量蕊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艇挨。 傳聞我的和親對象是個殘疾皇子残炮,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 簡單, 是那樣的艱難缩滨。 看山是山的幼稚势就, 看水是水的可笑。 可不管世事如何變幻脉漏, 山依舊是山苞冯, 水依舊是水。 總想...
    想飛的樹不如草閱讀 216評論 0 0
  • 據(jù)不少鋒友測試侧巨,iOS 12的流暢度非常不錯舅锄,再加上這些新功能,值得升級司忱! 今天凌晨的 WWDC 上皇忿,蘋果發(fā)布了 ...
    撒旦家的貓閱讀 368評論 0 0
  • 自從手機換成Nexus 6P之后,系統(tǒng)一直是保持最新系統(tǒng)坦仍。因此一些新系統(tǒng)的特性也能體驗到鳍烁。目前已經(jīng)有些應(yīng)用使用了A...
    VictorLiang閱讀 888評論 0 0