Java之一文詳解String字符串的用法
一. String字符串簡介
1. 概述
String是Java里的一個類,屬于引用類型,遵循引用類型的基本規(guī)律和要求。但它也有自己的一些特點,比如可以直接用雙引號"......"來表示一個字符串,所以凡是用雙引號括起來的一串字符都是String對象,如“Hello”在編譯后就會成為一個String對象。
而且String是final類,一旦創(chuàng)建了一個String對象,理論上就不能再被改變,當(dāng)然我們可以使用其他變量重新賦值的方式進(jìn)行更改。
另外從名字上我們也可以猜測出,字符串與字符有一定的關(guān)系。實際上,String字符串的內(nèi)部是通過一個private final char[]數(shù)組
來實現(xiàn)數(shù)據(jù)存儲的,所以我們可以通過如下方式來表示一個字符串:
String str = new String(new char[] {'H', 'e', 'l', 'l', 'o', 'y', 'y', 'g'});
當(dāng)然,以上這種字符串的表達(dá)方式太過麻煩,而且由于String太常用了,所以Java就提供了"......"這種極簡的表達(dá)方式供我們使用。
我們要知道,Java字符串的一個重要特點就是字符串的不可變性。這種不可變主要是通過final修飾String類,private final char[]
字段對數(shù)據(jù)的存儲,且沒有提供任何可以修改char[]字段的方法來實現(xiàn)的。
2. 與字符的區(qū)別
壹哥之前給大家講過java里的8種基本數(shù)據(jù)類型,我們知道,其中有一種比較特殊的char字符類型,可以在單引號中存儲單個的字符元素,比如'A'、'9'、'國' 等。而我們今天要學(xué)習(xí)的String類,則是用雙引號"..."來表達(dá)字符串的。作為初學(xué)者,我們一定要注意字符與字符串的區(qū)別:
- 字符只能表示單個字符元素,必須用單引號''把單個的字符元素括起來,如'A'、'9'、'國' 等;
- 字符串可以表示單個或多個字符元素,必須用雙引號把單個或多個字符元素括起來,如"A"、"Hi"、"中國"等;
- 字符是基本類型,其本質(zhì)是一種數(shù)值;字符串是引用類型,其本質(zhì)是一個java類。
3. 定義方式
String字符串的定義方式,常用的有如下兩種:
通過構(gòu)造方法創(chuàng)建字符串對象;
直接賦值。
我們在開發(fā)時,其實很少使用第一種方式,因為太過啰嗦,一般都是通過直接賦值的方式進(jìn)行定義。
3.1 構(gòu)造方法定義
Java為String類提供了11個構(gòu)造方法創(chuàng)建String對象,這些方法提供了不同的參數(shù)來初始化字符串。當(dāng)字符串變量被創(chuàng)建處理后,必須經(jīng)過初始化才能使用。下面是通過構(gòu)造方法定義String對象的幾種方式,大家可以參考:
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo01 { public static void main(String[] args) { //通過構(gòu)造方法創(chuàng)建String對象 //構(gòu)造一個空字符串,相當(dāng)于String s1=""; String s1=new String(); System.out.println("s1的長度="+s1.length()+",s1="+s1); //構(gòu)造一個由內(nèi)容的字符串,相當(dāng)于String s1 = "一一哥"; String s2 = new String("跟一一哥學(xué)Java"); System.out.println("s2的長度="+s2.length()+",s2="+s2); //通過字節(jié)數(shù)組構(gòu)建字符串對象 byte[] b = {97,98,99,100}; String s3=new String(b); System.out.println("s3的長度="+s3.length()+",s3="+s3); //通過字節(jié)數(shù)組構(gòu)建字符串對象 //參數(shù)1:字節(jié)數(shù)組;參數(shù)2:起始下標(biāo);參數(shù)3:長度 String s4 = new String(b, 0, b.length); System.out.println("s4的長度="+s4.length()+",s4="+s4); //通過字符數(shù)組創(chuàng)建字符串對象 char[] c = {'一','一','哥'}; String s5 = new String(c, 0, c.length); System.out.println("s5的長度="+s5.length()+",s5="+s5); } }
3.2 直接賦值定義
下面是通過直接賦值的方式來定義String對象的方式,大家可以參考:
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo02 { public static void main(String[] args) { //直接賦值的方式創(chuàng)建String對象 //注意:null表示String對象為空,而""表示一個長度為零、內(nèi)容為空的空字符串對象,但該對象不為空 //定義一個值為null的空字符串 String s1=null; System.out.println("s1="+s1); //定義一個內(nèi)容為空,長度為零的字符串 String s2 = ""; System.out.println("s2的長度="+s2.length()+",s22="+s2); //定義一個帶有內(nèi)容的字符串 String s3 = "一一哥"; System.out.println("s3的長度="+s3.length()+",s3="+s3); } }
我們要注意String s=null
與String s=""
的區(qū)別:
String s=null
表示String對象為空,即字符串對象的引用指向了null,還沒有指向任何的內(nèi)存空間;String s=""
是聲明了一個字符串類型的引用,其值為"",表示是一個長度為零、內(nèi)容為空的空字符串對象,但該對象不為空! 這個s對象的引用指向的是空字符串的內(nèi)存空間。
以上內(nèi)容,是對字符串定義和使用的常規(guī)操作,但實際上String字符串還有其他很多有用的方法,接下來壹哥就專門給大家介紹一下這些實用方法。
二. 字符串實用方法
1. 字符串的比較方法
在Java中,如果我們想比較兩個字符串,其實主要是比較兩個字符串的內(nèi)容是否相同,所以應(yīng)該使用 equals() 方法,而不要使用 == 進(jìn)行比較。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo04 { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; //==用于比較兩個對象的地址 System.out.println("s1==s2的結(jié)果:"+(s1 == s2)); //equals()用于比較兩個對象的內(nèi)容 System.out.println("s1.equals(s2)的結(jié)果:"+s1.equals(s2)); } }
大家注意,在上面的案例中,雖然使用==和equals()比較的結(jié)果都是true,但實際上這只是”湊巧“罷了。在本案例中,之所以使用”==“進(jìn)行比較的結(jié)果也是true,這是因為Java編譯器在編譯期,自動把所有相同內(nèi)容的字符串當(dāng)作一個對象放入到了字符串常量池。所以s1和s2都指向了同一個引用地址,結(jié)果自然就是相同的。但如果我們把上述案例換一種寫法,再利用”==“進(jìn)行比較就不是這樣的結(jié)果。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo04 { public static void main(String[] args) { //新的寫法 String s3 = "yiyige"; //將字符串轉(zhuǎn)為小寫 String s4 = "YIYIGE".toLowerCase(); //此時s3和s4是指向兩個不同引用地址的對象 System.out.println("s3==s4的結(jié)果:"+(s3 == s4)); System.out.println("s3.equals(s4)的結(jié)果:"+s3.equals(s4)); } }
從上面的案例中,我們可以得出一個結(jié)論,要想比較兩個字符串,應(yīng)該使用 equals() 方法,而不是"=="方法!
2. 判斷字符串是否為空
另外在前面的代碼案例中,壹哥還給大家介紹了兩種定義String字符串對象的方式,并在第2種方式中給大家提到了null與""兩種為空的情況。而我們在實際開發(fā)中,判斷一個字符串對象是null與"",其實是一種非常常見的操作,那么我們該怎么判斷String對象是否是null或""呢?
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo03 { public static void main(String[] args) { //判斷字符串對象是否為null或"" //注意null表示String對象為空,而""表示是一個長度為零、內(nèi)容為空的空字符串對象,但該對象不為空 //定義一個值為null的空字符串 String s1=null; //判斷方式1:判斷對象是否為null if(s1==null) { System.out.println("s1字符串對象為null,s1="+s1); } //定義一個內(nèi)容為空,長度為零的字符串 String s2 = ""; //判斷方式2:這種判斷寫法存在異常隱患,字符串對象s2有可能為null,如果s2.equals()調(diào)用時,s2可能為null,此時就會出現(xiàn)空指針異常 if(s2.equals("")) { System.out.println("s2的長度="+s2.length()+",s2="+s2); } //判斷方式3:對上面的判斷方式進(jìn)行改進(jìn),用以下方式進(jìn)行判斷,就會消除空指針異常的隱患 if("".equals(s2)) { System.out.println("s2的長度="+s2.length()+",s2="+s2); } //判斷方式4:判斷一個空串的長度是否為0,這種判斷字符串是否為空的方式效率更高 if(s2.length()==0) { //我們也可以直接使用字符串的isEmpty()方法,其內(nèi)部實現(xiàn)與此方式相同。 System.out.println("s2的長度="+s2.length()+",s2="+s2); } //判斷方式5:更全面嚴(yán)謹(jǐn)?shù)呐袛唷==null一定要寫在前面,因為如果s為null,先調(diào)用后面的s.length()就會出現(xiàn)空指針異常 if(s2 == null || s2.length() == 0) { System.out.println("s2的長度="+s2.length()+",s2="+s2); } //判斷方式6:或者我們直接使用字符串的isBlank()方法 if(s2.isBlank()) { System.out.println("s2的長度="+s2.length()+",s2="+s2); } } }
在實際開發(fā)時,我們一般是采用第5種判斷方式,這種判斷方式更為嚴(yán)謹(jǐn),能夠把兩種”為空“的情況都考慮到。當(dāng)然,我們也可以直接使用字符串對象提供的isEmpty()或isBlank()方法,進(jìn)行判空。另外我們要特別注意,防止出現(xiàn)空指針異常,并且也要考慮采用哪種方式判斷為空的情況效率更高。
3. 判斷相關(guān)的方法
String字符串中提供了幾個與字符串判斷相關(guān)的方法,可以對一個字符串進(jìn)行各種判斷,這幾個方法如下:
- equals(): 判斷兩個字符串的內(nèi)容是否相同;
- equalsIgnoreCase(): 判斷兩個字符串是否相等,忽略大小寫;
- isEmpty(): 判斷字符串是否為空串"",主要是判斷字符串長度是否為0;
- isBlank(): 判斷字符串是否為空串"",主要是判斷字符串中是否包含空白字符;
- startsWith(): 判斷字符串是否以指定的字符串開頭;
- endsWith(): 判斷字符串是否以指定的字符串結(jié)尾;
- contains(): 判斷字符串中是否包含指定的字符串,參數(shù)是CharSequence類型,而不是String。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo05 { public static void main(String[] args) { String s1 = "yiyige"; //判斷兩個字符串的內(nèi)容是否相同 System.out.println("yiYige".equals(s1)); //判斷兩個字符串是否相等,忽略大小寫 System.out.println("yiyige".equalsIgnoreCase(s1)); //判斷字符串是否為空,或是否有空白字符 //長度為0,字符串為空 String s2=""; //長度不是0,字符串不為空 String s3=" "; //長度不是0,字符串不為空 String s4=" \n"; //判斷字符串是否為空串"" System.out.println("s2為空嗎?"+s2.isEmpty());//true System.out.println("s3為空嗎?"+s3.isEmpty());//false System.out.println("s4為空嗎?"+s4.isEmpty());//false //判斷字符串是否是空串或有空白字符 System.out.println("s2為空嗎?"+s2.isBlank());//true System.out.println("s3為空嗎?"+s3.isBlank());//true System.out.println("s4為空嗎?"+s4.isBlank());//true String s5 = "1234567890123"; //判斷字符串是否以指定的字符開頭 System.out.println(s5.startsWith("12")); //判斷字符串是否以指定的字符串開頭,并指定開始位置 System.out.println(s5.startsWith("34", 2)); //判斷字符串是否以指定的字符串結(jié)尾 System.out.println(s5.endsWith("23")); //判斷字符串中是否包含指定的字符串 System.out.println(s5.contains("SB")); } }
4. 獲取相關(guān)的方法
String字符串中提供了幾個與字符串獲取相關(guān)的方法,這幾個方法如下:
- charAt(): 獲取指定下標(biāo)位置上對應(yīng)的字符,并返回char類型;
- indexOf(): 獲取指定字符串在原字符串中的下標(biāo)索引位置,如果不包含該字符串則返回-1;
- lastIndexOf() :該方法與indexOf()類似,但該方法是從后往前找,找到指定字符最后出現(xiàn)的位置;
- length(): 該方法用于返回字符串對象中包含的字符數(shù)量,即可以獲取字符串的長度。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo06 { public static void main(String[] args) { String s1 = "abcn12c3fcds"; //charAt(index),獲取指定下標(biāo)位置上對應(yīng)的字符,并返回char類型 System.out.println("下標(biāo)索引位置3上的字符是:"+s1.charAt(3)); //indexOf("字符串"),獲取指定字符串在原字符串中的下標(biāo)位置,如果不包含該字符串則返回-1 System.out.println("字符串的索引位置是:"+s1.indexOf("cn2")); //lastIndexOf("字符串"),與indexOf()方法類似,區(qū)別是該方法是從后往前找,找到指定字符最后出現(xiàn)的位置 System.out.println("指定字符的索引為:"+s1.lastIndexOf("c")); //length(),獲取字符串的長度 System.out.println("字符串的長度是:"+s1.length()); } }
5. 拼接、替換、截取、分割、去空格等方法
String字符串中提供了拼接、替換、截取、分割等方法,這幾個方法如下:
- concat(): 將某個字符串連接到該字符串的結(jié)尾,并返回拼接后的字符串,相當(dāng)于s1 = s1 + "world";
- join(): 用指定的字符串連接字符串?dāng)?shù)組;
- replace(): 將字符串中指定的字符串替換成指定的字符串;
- replaceAll() :利用正則表達(dá)式,將字符串中指定的字符串替換成指定的字符串;
- substring(start,end): 字符串截取,從指定的下標(biāo)索引開始和結(jié)束,范圍是左閉右開,注意索引是從0開始;
- substring(index) : 字符串截取,從指定的索引下標(biāo)開始一直截取到字符串的最后;
- split(): 字符串切割,按照指定的字符串對原字符串進(jìn)行切割;
- trim() :不改變原有字符串內(nèi)容,只是去除字符串首尾的空白字符,包括空格、\t、\r、\n。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo07 { public static void main(String[] args) { //用指定的字符串連接字符串?dāng)?shù)組 String[] arr = {"A", "B", "C"}; String str = String.join("***", arr); // "A***B***C" System.out.println("新的字符串str="+str); String s1 = "hello,SB"; //將字符串與指定的字符串進(jìn)行拼接,相當(dāng)于s1 = s1 + "world"; s1 = s1.concat("world"); System.out.println("新的字符串="+s1); //字符串替換:將字符串中指定的字符串替換成指定的字符串 s1 = s1.replace("SB", "**"); System.out.println("新的字符串="+s1); String s2 = "A,,B;C ,D"; //利用正則表達(dá)式,將字符串中指定的字符串替換成指定的字符串; //通過正則表達(dá)式,把匹配的子串統(tǒng)一替換為"," s2 = s2.replaceAll("[\,\;\s]+", ","); // "A,B,C,D" System.out.println("新的字符串s2="+s2); //字符串截取,從指定的下標(biāo)開始和結(jié)束,范圍是左閉右開 s1 = s1.substring(0, 5); System.out.println("新的字符串="+s1); //字符串截取,從指定的下標(biāo)開始一直截取到字符串的最后。 //注意:StringIndexOutOfBoundsException s1 = s1.substring(3); System.out.println("新的字符串="+s1); //字符串切割,按照指定的字符串對原字符串進(jìn)行切割 String s2 = "zhangsan-lisi-wangwu"; //利用指定的分隔符進(jìn)行分割 String[] s = s2.split("-"); System.out.println(Arrays.toString(s)); //去除字符串前后的空格 String s3 = " 你好, 哈哈 "; s3 = s3.trim(); System.out.println("新的字符串s3="+s3); } }
6. 大小寫轉(zhuǎn)換的方法
String字符串中提供了將字符串轉(zhuǎn)為小寫、大寫等方法,這幾個方法如下:
- toUpperCase(): 將字符串中的字母都變成大寫;
- toLowerCase(): 將字符串中的字母都變成小寫。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo08 { public static void main(String[] args) { String s1 = "abcADC你好123"; //將字符串中的字母變成大寫 System.out.println("轉(zhuǎn)換后新的字符串="+s1.toUpperCase()); //將字符串中的字母變成小寫 System.out.println("轉(zhuǎn)換后新的字符串="+s1.toLowerCase()); } }
7. 字符串轉(zhuǎn)數(shù)組的方法
String字符串中提供了將字符串轉(zhuǎn)為字節(jié)、字符數(shù)組的方法,這幾個方法如下:
- getBytes(): 將字符串轉(zhuǎn)變成字節(jié)數(shù)組;
- toCharArray(): 將字符串變成字符數(shù)組。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo08 { public static void main(String[] args) { String s1 = "abcd你好"; //將字符串轉(zhuǎn)變成字節(jié)數(shù)組 byte[] b = s1.getBytes(); System.out.println(Arrays.toString(b)); //將字符串變成字符數(shù)組 char[] c = s1.toCharArray(); System.out.println(Arrays.toString(c)); } }
8. 其他類型轉(zhuǎn)字符串的方式
我們可以利用如下幾種方式將其他類型轉(zhuǎn)為String字符串:
- 利用"+"號拼接: 通過拼接得到一個新的字符串對象;
- valueOf()方法: 將其他的類型的數(shù)據(jù)轉(zhuǎn)換成String類型;
- 構(gòu)造方法:也可以使用字符串對應(yīng)的構(gòu)造方法,將字節(jié)、字符數(shù)組類型轉(zhuǎn)為字符串對象,效率較低。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo08 { public static void main(String[] args) { //其他類型轉(zhuǎn)字符串的方式 int i = 10; //方式1:利用+號進(jìn)行轉(zhuǎn)換 String s1 = i+""; System.out.println("整形轉(zhuǎn)字符串s1="+s1); //方式2:將其他的類型的數(shù)據(jù)轉(zhuǎn)換成String類型 String s2 = String.valueOf(i); System.out.println("整形轉(zhuǎn)字符串s2="+s2); //方式3:將字節(jié)數(shù)組轉(zhuǎn)為字符串 byte[] nums= {97, 98, 99, 100}; String s3=new String(nums); System.out.println("整形轉(zhuǎn)字符串s3="+s3); } }
9. 格式化字符串的方法
除了以上這些方法之外,String還提供了幾個可以用于格式化字符串的方法,如下:
- format(): 可以將字符串進(jìn)行格式化操作。
/** * @author 一一哥Sun * 千鋒教育 */ public class Demo09 { public static void main(String[] args) { //實例方法:String對象.format() //%d、%s、%.2f都是占位符 String s = "恭喜你,%s, 你的得分是:%d!"; System.out.println(s.formatted("壹壹哥", 99)); //靜態(tài)方法:String類.format() System.out.println(String.format("恭喜你,%s, 你的成績是:%.2f!", "一一哥2", 46.5)); } }
在上面的案例中,涉及到了幾個占位符,主要是配合參數(shù)進(jìn)行格式化。當(dāng)使用占位符時,就需要參數(shù)類型要和占位符要求的一致。常用的占位符含義如下:
- %s : 表示字符串;
- %d : 表示整數(shù);
- %x : 表示十六進(jìn)制整數(shù);
- %f : 表示浮點數(shù)。
另外占位符還可以帶格式,例如%.2f是表示顯示兩位小數(shù)。如果你不確定到底該用哪個占位符,可以選擇使用%s,因為%s可以顯示任何數(shù)據(jù)類型。
以上這些方法,就是String字符串中的一些常用方法,當(dāng)然并不是全部的方法。
三. 結(jié)語
至此,String字符串對象的定義方式,以及String類中常用的API方法給大家介紹完了,我們要掌握本文的重點內(nèi)容,比如:
- 掌握String對象的定義方式;
- 掌握字符串對象的比較方式;
- 掌握字符串判空的方式及方法;
- 了解java中的常用占位符;
- 掌握其他重要方法。
以上就是Java之一文詳解String字符串的用法的詳細(xì)內(nèi)容,更多關(guān)于Java String字符串用法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java使用cxf發(fā)布及調(diào)用webservice接口的方法詳解
今天小編就為大家分享一篇關(guān)于Java使用CXF發(fā)布及調(diào)用WebService接口的方法,文中通過代碼示例給大家介紹的非常詳細(xì),具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2023-08-08SpringBoot和Vue.js實現(xiàn)的前后端分離的用戶權(quán)限管理系統(tǒng)
本文主要介紹了SpringBoot和Vue.js實現(xiàn)的前后端分離的用戶權(quán)限管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Spring中AOP的切點、通知、切點表達(dá)式及知識要點整理
這篇文章主要介紹了Spring中AOP的切點、通知、切點表達(dá)式及知識要點整理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03