字符串變量是引用數(shù)據(jù)類型,其變量名存儲(chǔ)在內(nèi)存A區(qū)(相對小的區(qū)域),B區(qū)存字符串內(nèi)容(所有引用類型都是如此存儲(chǔ)),A區(qū)字符串地址的內(nèi)容就是B區(qū)對應(yīng)字符串存儲(chǔ)的地址,而像int型數(shù)字就只存在于A區(qū),變量名地址的內(nèi)容就是其數(shù)值,String在java.lang包下(課程上老師講的很多函數(shù)的具體用法可能都沒講全,需要自己課下多看看文檔能怎么用)
如果對一個(gè)字符串變量重新賦值,相當(dāng)于在B區(qū)新開辟一個(gè)區(qū)域,然后將A去字符串變量名的地址存儲(chǔ)內(nèi)容改成新的B區(qū)地址(和python貼標(biāo)簽一樣)
定義字符串變量
String a = "Hello World!";
String b = new String("Tom"); //通過字符串類
"\n”同樣表示換行
System.out.println(a+'\n'+b);//將a,b換行輸出
字符串拼接
字符串和字符串加法沒說的了
不同的內(nèi)容和字符串拼接得到的結(jié)果還是字符串,看下例,注意字符'a'不是按數(shù)值走
String a = "Hello";
String b = a+3+true+'a'+4.12;? ? ? ? ? //Hello3truea4.12
字符串a(chǎn)pi
定義String s = "hello";后相關(guān)字符串對象s的函數(shù)
s.length()獲得字符串長度(別少了括號(hào)會(huì)報(bào)錯(cuò))
s.indexOf(a)獲得字符串a(chǎn)在s的索引,如果a是s的子字符串(s包含a,a可以是一個(gè)或多個(gè)連續(xù)的字符串也可以是字符常量或者滿足字符范圍的ascii碼值的int數(shù))j就返回對應(yīng)的索引(有重復(fù)子串返回第一個(gè)),從開頭0數(shù)起,如果不在,返回-1,注意函數(shù)是駝峰命名,O大寫,函數(shù)還可以輸入字符(或字符對應(yīng)得整數(shù)),查找對應(yīng)字符的索引
s.lastIndexOf(a)同上,但是重復(fù)子串的時(shí)候獲取的是最后一個(gè)
s.charAt(i)獲取s字符串i索引位置的內(nèi)容,超出范圍會(huì)報(bào)錯(cuò)(0到length()-1)
下例實(shí)現(xiàn)逐個(gè)字符輸出b
String b = "abcdefghi";
for(int i=0;i<b.length();i++){
System.out.println(b.charAt(i));
}
s.substring(startindex)獲得字符串從索引到結(jié)束的字符串內(nèi)容(超邊界會(huì)報(bào)錯(cuò))(還有注意函數(shù)不符合駝峰規(guī)則,沒有大寫)
s.substring(startindex,endindex)字符串從startindex到endindex(右側(cè)不包括)之間的內(nèi)容(類似python切片)
s.startsWith(a)判斷字符串s是否以a(a只能使用字符串,不能使用字符和int)開頭,條件滿足返回true否則false,注意拼寫有字母s,如果判斷是以空字符串開頭也返回true
s.endsWith(a)判斷字符串是否以a結(jié)尾,要求和前者一樣
將判斷字符串相等之前先講一下字符串存儲(chǔ),我們?nèi)缦露x字符串
String str = "www.sikiedu.com";
String str2 = "www.sikiedu.com";
String str3 = new String( "www.sikiedu.com");
三種方式創(chuàng)建了字符串,他們print結(jié)果都是一樣的,但是存儲(chǔ)方式有區(qū)別,內(nèi)存中,變量名存儲(chǔ)于棧,引用類等存儲(chǔ)于堆,常量存儲(chǔ)于方法區(qū)的運(yùn)行常量區(qū)內(nèi),我們str定義在棧中,同時(shí)常量區(qū)就有了字符串內(nèi)容的,其地址是089,棧內(nèi)str地址存放的內(nèi)容就是089(字符串地址),同理str2創(chuàng)建,但是因?yàn)槌A恳呀?jīng)存在,不重復(fù)創(chuàng)建常量,只是將st2的地址存放內(nèi)容變成089,而str3是通過引用對象生成,需要在堆區(qū)開辟一個(gè)空間,str3的地址就指向了堆區(qū)的地址,而堆區(qū)進(jìn)一步指向常量區(qū)的常量。如下圖

我們使用==判斷字符串時(shí),是判斷其引用內(nèi)容是否相等,如str==str2是看棧區(qū)的存放地址是否相等,因此str==str2為true,str==str3為false
s.equals(a)判斷字符串a(chǎn)和s的內(nèi)容是否相等,這里判斷的是最終引用常量,上面的str.equals(str3)就可以返回true了,注意拼寫不要少了s
s.equalsIgnoreCase(a)比較s和a的字符串內(nèi)容,無視大小寫,返回true,false
s.compareTo(a)比較字符串s和a的每個(gè)字符,相等判斷下一個(gè),如不等,返回ascii碼差值不計(jì)算其他位,全部相等返回0,如果長度不等(即出現(xiàn)要和空字符比較),則返回長度的差值
s.contains(a)字符串s是否包含子串,是否返回true,false,拼寫有s
s.isEmpty()判斷字符串s是否為空字符串,返回true,false
如果定義String s = null;后嘗試調(diào)用isEmpty()就會(huì)報(bào)錯(cuò),我們定義類型變量如果開始不知道明確的值,可以先賦值null,但是null對象是沒有isEmpty()方法的
s.toLowerCase()返回s字符串的字母全部轉(zhuǎn)化為小寫字母的字符串,s本身不變
s.toUpperCase()返回s字符串的字母全部轉(zhuǎn)化為大寫字母的字符串,s本身不變
s.split(a)以a字符串作為分隔,返回的是字符串?dāng)?shù)組
代碼如下圖,中間使用了String []數(shù)組strs接收結(jié)果,數(shù)組我們后邊學(xué),這里先混個(gè)臉熟,這里還有選擇點(diǎn)作為分隔,使用字符串是\\.因?yàn)?是關(guān)鍵符號(hào),java中使用\.存儲(chǔ),而字符串中\(zhòng)也是特殊符號(hào),所以使用\\.,最后使用了for()遍歷數(shù)組strs,這里學(xué)習(xí)下
特殊情況,當(dāng)分隔符位于字符串左邊界時(shí),字符串?dāng)?shù)組第一個(gè)元素為空字符串,而邊界位于右邊時(shí),沒有空字符串

s.split(String a,int limit)s字符串以a字符串分割,limit是分割最大次數(shù)限制,即從左側(cè)開始分割,達(dá)到次數(shù)上限時(shí),把最后一個(gè)分割連同字符串剩下的所有內(nèi)容一起送給數(shù)組最后一個(gè)元素,下圖運(yùn)行分別輸出a和b.c.d

s.trim()函數(shù)返回s字符串首尾的多個(gè)空格刪除(類比于python的strip)的字符串,不影響原來的字符串
s.replace(old,new)返回一個(gè)新字符串,其把原來每個(gè)old內(nèi)容替換成new,其中old,new內(nèi)容必須一致,可以都是字符串,也可以都是字符,但不能一個(gè)是字符一個(gè)是字符串