這篇文章主要介紹“Java字符串相關(guān)類(lèi)怎么使用”,在日常操作中,相信很多人在Java字符串相關(guān)類(lèi)怎么使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java字符串相關(guān)類(lèi)怎么使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括蕭縣網(wǎng)站建設(shè)、蕭縣網(wǎng)站制作、蕭縣網(wǎng)頁(yè)制作以及蕭縣網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,蕭縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到蕭縣省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
String、StringBuilder、StringBuffer類(lèi)是三個(gè)字符串相關(guān)類(lèi)。
String類(lèi)代表不可變字符序列,StringBuilder類(lèi)和StringBuffer類(lèi)代表可變字符序列。
關(guān)于這三個(gè)類(lèi)的詳細(xì)的用法,在筆試和面試以及實(shí)際開(kāi)發(fā)中經(jīng)常能用到,我們必須掌握好它。
String的常用方法:
1.isEmpty()如果字符串為空返回 true,否則返回 false
2.length()計(jì)算字符串長(zhǎng)度
3.isBlank()如果給定的字符串為空或僅包含空格代碼點(diǎn),則此方法返回 true ,否則返回 false
4.startsWith()是否以括號(hào)內(nèi)的字符串開(kāi)始
5.endsWith()是否以括號(hào)內(nèi)的字符串結(jié)束
6.toLowerCase()生成一個(gè)新的字符串,字符串的英文字符全部變小寫(xiě)
7.toUpperCase()生成一個(gè)新的字符串,字符串的英文字符全部變大寫(xiě)
8.charAt()返回指定索引位置的char值。索引范圍為0~length()-1
9.substring(int startIndex)子字符串從索引開(kāi)始
10.substring(int startIndex,int endIndex)返回一個(gè)字符串,該字符串是此字符串的子字符串。
子串開(kāi)始于指定beginIndex并延伸到字符索引endIndex- 1
11.public int indexOf(int ch) 返回指定字符第一次出現(xiàn)的字符串內(nèi)的第一個(gè)索引
12.indexOf(String str, int fromIndex)返回指定子串的第一次出現(xiàn)的字符串中的索引,從指定的索引開(kāi)始
13.lastIndexOf 從后向前查詢第一次遇到的指定字符串的索引位置,注意索引還是從前往后數(shù)起
14.split()方法:分割字符串,參數(shù)regex稱為分割符,可以使用正則表達(dá)式來(lái)表示
15.replace()用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。區(qū)分大小寫(xiě)
16.replaceAll(String regex,String replacement)用給定的替換替換與給定的regular expression匹配的此字符串的每個(gè)子字符串。regex - 要匹配此字符串的正則表達(dá)式, replacement - 要替換每個(gè)匹配的字
17.trim()去掉字符串兩邊的空格
18.toCharArray()將字符串轉(zhuǎn)換為字符數(shù)組
19.concat()方法,在字符串的末尾追加子串
20.contains()當(dāng)且僅當(dāng)此字符串包含指定的char值序列時(shí),返回true
21.compareTo()返回比較的前后兩個(gè)字符串的ASCII碼的差值,如果兩個(gè)字符串首字母不同,則該方法返回首字母的ASCII碼的差值,如果首字符相同,則比較下一個(gè)字符,直到有不同的為止,返回該不同的字符的ASCII碼差值。如果兩個(gè)字符串不一樣長(zhǎng),可以參與比較的字符又完全一樣,則返回兩個(gè)字符串的長(zhǎng)度差值。
例子1:
package li.normalclass.stringclass; import java.util.Arrays; public class TestString { public static void main(String[] args) { // 1.如何創(chuàng)建String對(duì)象 String str = "北京天安門(mén)abc"; // 2.如何使用String對(duì)象 // 2.1最簡(jiǎn)單的方法 System.out.println(str.length() );//8 注意是字符的個(gè)數(shù),不是字節(jié)的個(gè)數(shù) //如果字符串為空返回 true,否則返回 false System.out.println(str.isEmpty());//false //jdk11新增的方法,如果給定的字符串為空或僅包含空格代碼點(diǎn),則此方法返回 true ,否則返回 false System.out.println(str.isBlank());//false //是否已括號(hào)內(nèi)的字符串為開(kāi)始 System.out.println(str.startsWith("北京天"));//true // 是否已括號(hào)內(nèi)的字符串為結(jié)束 System.out.println(str.endsWith("c"));//true //生成一個(gè)新的字符串,字符串的英文字符全部變小寫(xiě) System.out.println(str.toLowerCase()); //北京天安門(mén)abc //生成一個(gè)新的字符串,字符串的英文字符全部變大寫(xiě) System.out.println(str.toUpperCase());//北京天安門(mén)ABC /* 注意:String是不可變字符序列,上面的方法改變的只是新生成的字符串,這里重新輸出str,依舊是原來(lái)的字符 */ System.out.println(str);//北京天安門(mén)abc //2.2根據(jù)索引找子串 //charAt()方法返回指定索引位置的char值。索引范圍為0~length()-1 char c = str.charAt(3);//注意下標(biāo)從0開(kāi)始 System.out.println(c);//安 //str.substring(int startIndex); //子字符串的下標(biāo)從索引開(kāi)始 System.out.println(str.substring(2));//天安門(mén)abc //substring(int startIndex,int endIndex); /*返回一個(gè)字符串,該字符串是此字符串的子字符串。 子串開(kāi)始于指定beginIndex并延伸到字符索引endIndex- 1 因此,子串的長(zhǎng)度為endIndex-beginIndex */ System.out.println(str.substring(5,8));//abc // 2.3根據(jù)子串找索引 //public int indexOf(int ch)返回指定字符第一次出現(xiàn)的字符串內(nèi)的第一個(gè)索引 int index = str.indexOf("abc"); System.out.println(index);//5 //indexOf(String str, int fromIndex) //返回指定子串的第一次出現(xiàn)的字符串中的索引,從指定的索引開(kāi)始。 System.out.println(str.indexOf("門(mén)", 2));//4 //從后向前查詢第一次遇到的指定字符串的索引位置,注意索引還是從前往后數(shù)起 System.out.println(str.lastIndexOf("北"));//0 // 2.4其他方法 /* str.concat(); str.trim(); str.split(); str.replace(); str.replaceAll()等 */ //split(String regex) //split()方法:分割字符串,參數(shù)regex稱為分割符,可以使用正則表達(dá)式來(lái)表示 String str2 = "Java,HTML,MySQL,Spring,java,Java"; String arr [] = str2.split("S"); System.out.println(Arrays.toString(arr));//[Java,HTML,My, QL,, pring,java,Java] //replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。區(qū)分大小寫(xiě) System.out.println(str2.replace("Java","javase"));//javase,HTML,MySQL,Spring,java,javase //public String replaceAll(String regex,String replacement) //用給定的替換替換與給定的regular expression匹配的此字符串的每個(gè)子字符串。 //regex - 要匹配此字符串的正則表達(dá)式, replacement - 要替換每個(gè)匹配的字 String str3 = "abc,adc,afffc,rty,acc"; String str4 = str3.replaceAll("a...c","#"); System.out.println(str4);//abc,adc,#,rty,acc //trim()去掉字符串兩邊的空格 String str5 = " rbg ni men hao "; System.out.println(str5.length());//27 System.out.println(str5.trim());//去掉字符串兩端的空格 "rbg ni men hao" System.out.println(str5.trim().length());//21 //toCharArray() char [] chArr = str.toCharArray();//str = "北京天安門(mén)abc" System.out.println(chArr); System.out.println(chArr[2]);//天 //concat()方法,在字符串的末尾追加子串 String str6 = "北京市"; str6 = str6.concat("紫禁城").concat("故宮").concat("博物院"); System.out.println(str6);//北京市紫禁城故宮博物院 //contains() 當(dāng)且僅當(dāng)此字符串包含指定的char值序列時(shí),返回true System.out.println( str6.contains("博物院"));//true /*compareTo()方法 返回比較的前后兩個(gè)字符串的ASCII碼的差值,如果兩個(gè)字符串首字母不同,則該方法返回首字母的ASCII碼的差值 如果首字符相同,則比較下一個(gè)字符,直到有不同的為止,返回該不同的字符的ASCII碼差值。 如果兩個(gè)字符串不一樣長(zhǎng),可以參與比較的字符又完全一樣,則返回兩個(gè)字符串的長(zhǎng)度差值。 返回為正數(shù)表示a1>a2, 返回為負(fù)數(shù)表示a1<a2, 返回為0表示a1==a2 */ String str1 = "jsdy"; String str2 = "jsdr"; System.out.println(str1.compareTo(str2));//7 } }
例子2:equals和雙等于號(hào)==
package li.normalclass.stringclass; public class TestString2 { public static void main(String[] args) { //equals String str1 = new String ("jsdy"); String str2 = new String ("jsdy"); System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true String str3 = "jsdy"; String str4 = "jsdy"; System.out.println(str3==str4);//ture!!! System.out.println(str3.equals(str4));//true String str5 = new String ("jsdy"); String str6 = "jsdy"; System.out.println(str5==str6);//false System.out.println(str5.equals(str6));//true String str7 = null;//沒(méi)有指向任何內(nèi)容 String str8 = new String(""); String str9 = "";//指向一個(gè)空字符串 System.out.println(str9.length());//0 //System.out.println(str7.length())-->java.lang.NullPointerException System.out.println(str8==str9);//false System.out.println(str8.equals(str9));//true } }
分析:
String str3 = "jsdy"; String str4 = "jsdy"; System.out.println(str3==str4);//ture!!!
采用字面值的方式創(chuàng)建一個(gè)字符串時(shí),JVM首先會(huì)去字符串池中查找是否存在"jsdy"這個(gè)對(duì)象,
如果不存在,則在字符串池中創(chuàng)建"jsdy"這個(gè)對(duì)象,然后將池中"jsdy"這個(gè)對(duì)象的引用地址返回給"jsdy"對(duì)象的引用str3,這樣str3會(huì)指向池中"jsdy"這個(gè)字符串對(duì)象;
如果存在,則不創(chuàng)建任何對(duì)象,直接將池中"jsdy"這個(gè)對(duì)象的地址返回,賦給引用str4。因?yàn)閟tr3、str4都是指向同一個(gè)字符串池中的"jsdy"對(duì)象,所以結(jié)果為true。
String str1 = new String ("jsdy"); String str2 = new String ("jsdy"); System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true
采用new關(guān)鍵字新建一個(gè)字符串對(duì)象時(shí),JVM首先在字符串池中查找有沒(méi)有"jsdy"這個(gè)字符串對(duì)象,
如果有,則不在池中再去創(chuàng)建"jsdy"這個(gè)對(duì)象了,直接在堆中創(chuàng)建一個(gè)"jsdy"字符串對(duì)象,然后將堆中的這個(gè)"jsdy"對(duì)象的地址返回賦給引用str1,這樣,str1就指向了堆中創(chuàng)建的這個(gè)"jsdy"字符串對(duì)象;
如果沒(méi)有,則首先在字符串池中創(chuàng)建一個(gè)"jsdy"字符串對(duì)象,然后再在堆中創(chuàng)建一個(gè)"jsdy"字符串對(duì)象,然后將堆中這個(gè)"jsdy"字符串對(duì)象的地址返回賦給str1引用,這樣,str1指向了堆中創(chuàng)建的這個(gè)"jsdy"字符串對(duì)象。str2則指向了堆中創(chuàng)建的另一個(gè)"jsdy"字符串對(duì)象。str1、str2是兩個(gè)指向不同對(duì)象的引用,結(jié)果當(dāng)然是false。
其他同理。
例子3:
//concat()方法,在字符串的末尾追加子串 String str6 = "北京市"; str6 = str6.concat("紫禁城"); str6 = str6.concat("故宮"); str6 = str6.concat("博物院"); System.out.println(str6);//北京市紫禁城故宮博物院
如上圖:
采用字面值的方式創(chuàng)建一個(gè)字符串時(shí),JVM首先會(huì)去字符串池中查找是否存在"北京"這個(gè)對(duì)象,如果不存在,則在字符串池中創(chuàng)建"北京"這個(gè)對(duì)象,然后將池中"北京"這個(gè)對(duì)象的引用地址返回給"北京"對(duì)象的引用str6。使用concat()方法可以追加子字符串,但是String是不可變長(zhǎng)序列,所以是實(shí)際上是在常量池重新創(chuàng)建了一個(gè)對(duì)象,并把追加的字符串連同原字符串一同賦值給新的對(duì)象,然后將新對(duì)象的引用地址返回給str6,這樣str6就指向了一個(gè)新的地址空間。每次使用concat()方法追加子串都會(huì)經(jīng)歷上述過(guò)程,str6的指向不斷改變,最終會(huì)指向最后一次開(kāi)辟的對(duì)象地址。
因此使用concat()追加子串的方法效率無(wú)疑是很低的,那么有沒(méi)有一種辦法可以直接在創(chuàng)建的對(duì)象里添加子串呢?這就是我們要涉及到的StringBuilder類(lèi)
String類(lèi)是一個(gè)final類(lèi),意味著該類(lèi)不能有子類(lèi)
String類(lèi)底層是一個(gè)字符數(shù)組value。各種方法的操作其實(shí)都是對(duì)該數(shù)組的操作。
String類(lèi)的equals()方法其實(shí)就是比較底層的字符數(shù)組的各個(gè)元素是否相同,只要發(fā)現(xiàn)一個(gè)元素不同,就返回false,如果所有字符都相同就返回true。但是如果兩個(gè)變量都指向了同一個(gè)字符數(shù)組,則直接返回true。
String類(lèi)的concat()方法是創(chuàng)建一個(gè)新的字符數(shù)組,存放原來(lái)字符數(shù)組和新加入的字符數(shù)組內(nèi)容,然后以該新數(shù)組創(chuàng)建一個(gè)新的字符串。
JDK9時(shí)String類(lèi)底層由char數(shù)組變?yōu)閎yte數(shù)組,節(jié)省空間。同時(shí)通過(guò)一個(gè)coder成員變量作為編碼格式的標(biāo)識(shí),使用LATIN1還是UFT-16,這個(gè)是在String生成時(shí)自動(dòng)的,如果字符串中都是能用LATIN1就能表示的是0,否則就是UFT-16。
StringBuffer和StringBuilder非常類(lèi)似,均代表可變的字符序列。
這兩個(gè)類(lèi)都是抽象類(lèi)AbstractStringBuilder的子類(lèi),方法幾乎一模一樣
兩個(gè)類(lèi)的主要區(qū)別是:
StringBuffer JDK1.0提供的類(lèi),線程安全,做線程同步檢查,效率較低
StringBuilder JDK1.5提供的類(lèi),線程不安全,不做線程同步檢查,因此效率較高。建議采用此類(lèi)
StringBuilder常用函數(shù):
append() 向字符串后追加一個(gè)子串
reverse() 倒置
delete() 刪除從start(包含)到end(不包含)位置的字符, start 為0~length-1
length() 獲取字符的長(zhǎng)度
toString() 將StringBuffer轉(zhuǎn)成String
replace() 從start到end之間的字符串替換成新字符串
insert() 在指定的偏移量位置插入值
indexOf() 從頭開(kāi)始查找某個(gè)字符串在源字符串中第一次出現(xiàn)的位置并返回
setCharAt() 設(shè)置指定索引位置的字符
charAt() 返回指定索引位置上的字符
substring() 從start(包含)位置截取字符串返回一個(gè)新的String,它包含此序列當(dāng)前所包含字符的子序列
例子:
package li.normalclass.stringbuilder; /* StringBuilder用得比較多的基本上就是這三個(gè)常見(jiàn)操作: 1.創(chuàng)建對(duì)象 StringBuilder builder = new StringBuilder("xxx"); 2.末尾追加字符串 builder.append("yyy"); 3.轉(zhuǎn)換為字符串 String str = builder.toString() System.out.println(str) */ public class TestStringBuilder1 { public static void main(String[] args) { //創(chuàng)建StringBuilder對(duì)象 /* 創(chuàng)建Builder對(duì)象時(shí),底層的數(shù)組大小實(shí)際為輸入的字符串長(zhǎng)度個(gè)數(shù)+16 */ StringBuilder builder = new StringBuilder("北京"); //length是字符的個(gè)數(shù),capacity是底層數(shù)組的長(zhǎng)度 System.out.println(builder.length()+"\t"+ builder.capacity());//2 (2+16=)18 //操作StringBuilder對(duì)象 //操作:字符串末尾增加 builder.append("故宮博物院"); System.out.println(builder.length()+"\t"+ builder.capacity());//7 18 builder.append("墻角下的"); //---->這里擴(kuò)容了,擴(kuò)容方法是:當(dāng)前字符串長(zhǎng)度*2+2,在這里既是18*2+2=38 System.out.println(builder.length()+"\t"+ builder.capacity());//11 38 builder.append("一只懶貓?jiān)谒X(jué)覺(jué)"); System.out.println(builder.length()+"\t"+ builder.capacity());//19 38 //操作:字符串中間位置增加 int i = builder.indexOf("下");//找到字符串的數(shù)組下標(biāo) builder.insert(i,"一棵銀杏樹(shù)");//在下標(biāo)前插入新的子串 System.out.println(builder.length()+"\t"+ builder.capacity());//24 38 //操作:字符串修改 int i2 = builder.indexOf("銀杏樹(shù)");//找到字符串的數(shù)組下標(biāo) builder.replace(i2,i2+3,"芒果樹(shù)");//要替換的字符串的起始位置,結(jié)束位置,要替換的字符串 :北京故宮博物院墻角一棵芒果樹(shù)樹(shù)下的一只懶貓?jiān)谒X(jué)覺(jué) //操作:字符串刪除 builder.deleteCharAt(23);//參數(shù)為要?jiǎng)h除的那個(gè)字符的索引下標(biāo) :北京故宮博物院墻角一棵芒果樹(shù)下的一只懶貓?jiān)谒X(jué) builder.delete(0,7);//start并延伸到字符索引end - 1:墻角一棵芒果樹(shù)下的一只懶貓?jiān)谒X(jué)子串開(kāi)始于指定 //操作:字符串輸出 String str = builder.toString();//將StringBuilder轉(zhuǎn)變?yōu)橐粋€(gè)字符串 System.out.println(str);//墻角一棵芒果樹(shù)下的一只懶貓?jiān)谒X(jué) System.out.println(builder.toString());//墻角一棵芒果樹(shù)下的一只懶貓?jiān)谒X(jué) System.out.println(builder);//墻角一棵芒果樹(shù)下的一只懶貓?jiān)谒X(jué) System.out.println(builder.reverse());//覺(jué)睡在貓懶只一的下樹(shù)果芒棵一角墻 System.out.println(builder);//覺(jué)睡在貓懶只一的下樹(shù)果芒棵一角墻--->沒(méi)有創(chuàng)建新的字符串對(duì)象 } }
注意實(shí)際開(kāi)發(fā)過(guò)程中StringBuilder的使用場(chǎng)合:字符串的拼接(SQL語(yǔ)句)
StringBuilder用得比較多的基本上就是這三個(gè)常見(jiàn)操作:
//1.創(chuàng)建對(duì)象(String-->StringBuilder) StringBuilder builder = new StringBuilder("xxx"); //2.末尾追加字符串 builder.append("yyy"); //3.轉(zhuǎn)換為字符串(StringBuilder--->String) String str = builder.toString() System.out.println(str);
StringBuilder的底層就是一個(gè)長(zhǎng)度可以自動(dòng)增長(zhǎng)的字符數(shù)組(JDK9變成了字節(jié)數(shù)組)
StringBuilder類(lèi)底層和String類(lèi)一樣,也是一個(gè)字符數(shù)組value,但不是final的。變量count表示的是底層字符數(shù)組的元素的真實(shí)個(gè)數(shù),不是底層字符數(shù)組的長(zhǎng)度。
默認(rèn)數(shù)組的長(zhǎng)度是16。也可以通過(guò)構(gòu)造方法直接指定初始長(zhǎng)度。length()方法返回的是字符數(shù)組元素的真實(shí)個(gè)數(shù),capacity()返回的是底層數(shù)組的長(zhǎng)度。
添加字符串時(shí)如果內(nèi)存大小不夠要擴(kuò)容,擴(kuò)容的默認(rèn)策略是增加到原來(lái)長(zhǎng)度的兩倍再加2
快捷鍵Ctrl+Alt+向左箭頭<·····可以實(shí)現(xiàn)跳轉(zhuǎn)到剛剛瀏覽的那個(gè)文件的那行代碼
例子1:StringBuilder構(gòu)造函數(shù)
StringBuilder builder = new StringBuilder(); //StringBuilder 的無(wú)參構(gòu)造初始容量為:16
例子2:new StringBuilder
//創(chuàng)建Builder對(duì)象時(shí),底層的數(shù)組大小實(shí)際為輸入的字符串長(zhǎng)度個(gè)數(shù)+16 StringBuilder builder = new StringBuilder("故宮博物院"); System.out.println(builder.length()+"\t"+ builder.capacity());
例子3:toString
String str = builder.toString(); System.out.println(str);
將builder的字符轉(zhuǎn)換為String字符串
到此,關(guān)于“Java字符串相關(guān)類(lèi)怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
當(dāng)前文章:Java字符串相關(guān)類(lèi)怎么使用
文章鏈接:http://aaarwkj.com/article4/iidpie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、App設(shè)計(jì)、網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)、、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)