Java字符串常見的操作(比較,查找,替換等)
在Java當(dāng)中,為字符串類提供了豐富的操作方法,對于字符串,我們常見的操作就是:字符串的比較、查找、替換、拆分、截取以及其他的一些操作。
在Java中,有String,StringBuffer 和 StringBuilder字符串類,他們的區(qū)別是String類是不可修改的,而StringBuffer 和 StringBuilder類是可以修改的。要注意的是,這里的修改不是字面意思上的修改。簡單來說,比如,要實現(xiàn)兩個字符串的拼接,對于前者來說,假設(shè)有str1 = "hello" , 要給他拼接一個"world",那么是這樣的,在這個過程中,"hello"本身沒有變,它還在池中。但是對于后兩者來說,假設(shè)有str2 = "世界",要拼接''你好'',拼接之后,池中就不存在"世界"了。StringBuffer 和 StringBuilder的區(qū)別就是一個是線程安全的,一個不是線程安全的。
下面,我們圍繞字符串的一些操作來進(jìn)行說明。
一,字符串的比較
1,equal()方法
官方文檔描述:
public boolean equals(Object anObject)
將此字符串與指定對象進(jìn)行比較。 其結(jié)果是true當(dāng)且僅當(dāng)該參數(shù)不是null并且是String對象,表示相同的字符序列作為該對象。
參數(shù)
anObject - 對比這個 String的對象
結(jié)果
true如果給定的對象代表一個 String等效于這個字符串, 否則false
String類當(dāng)中的equal()方法用來比較兩個字符串是否相等。這一種比較是區(qū)分大小寫的。當(dāng)有一個是字符串常量的時候,建議的寫法是將字符串常量放在外面,這樣的理由是:如果外面的變量是null的時候,就會拋出空指針異常。
String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1.equals(str2)); // 或者這樣寫也行 // System.out.println(str2.equals(str1)); // 執(zhí)行結(jié)果 //true
String str = new String("Hello"); // 方式一 System.out.println(str.equals("Hello")); // 方式二 System.out.println("Hello".equals(str)); //—————————————————————————————————————— String str = null; // 方式一 // 執(zhí)行結(jié)果 拋出 java.lang.NullPointerException 異常 System.out.println(str.equals("Hello")); // 方式二 // 執(zhí)行結(jié)果 false System.out.println("Hello".equals(str));
如果不需要區(qū)分大小寫的比較,使用equalsIgnoreCase()方法。這種方法一般見于驗證碼驗證的時候。
String str1 = "hello" ; String str2 = "Hello" ; //結(jié)果為false System.out.println(str1.equals(str2)); //結(jié)果為true System.out.println(str1.equalsIgnoreCase(str2));
2,compareTo()方法
官方文檔描述:
public int compareTo(String anotherString)
按字典順序比較兩個字符串。 比較是基于字符串中每個字符的Unicode值。 由該String對象表示的字符序列按字典順序與由參數(shù)字符串表示的字符序列進(jìn)行比較。 如果String對象按字典順序排列在參數(shù)字符串之前,結(jié)果為負(fù)整數(shù)。 結(jié)果是一個正整數(shù),如果String對象按字典順序跟隨參數(shù)字符串。 如果字符串相等,結(jié)果為零; compareTo返回0 ,當(dāng)equals(Object)方法將返回true 。
如果沒有它們不同的索引位置,則較短的字符串按字典順序位于較長的字符串之前。 在這種情況下, compareTo返回字符串長度的差異 - 即值:this.length()-anotherString.length()
參數(shù)
anotherString - 要比較的 String 。
結(jié)果
如果參數(shù)字符串等于此字符串,則值為0 ; 一個值小于0如果這個字符串的字典比字符串參數(shù)小; 如果此字符串的字典大小超過字符串參數(shù),則值大于0 。
在String類中compareTo()方法是一個非常重要的方法,該方法返回一個整型,該數(shù)據(jù)會根據(jù)大小關(guān)系返回三類內(nèi)容: 1. 相等:返回0. 2. 小于:返回內(nèi)容小于0. 3. 大于:返回內(nèi)容大于0。compareTo()是一個可以區(qū)分大小關(guān)系的方法,是String方法里是一個非常重要的方法。它的比較大小規(guī)則, 總結(jié)成三個字 "字典序" 相當(dāng)于判定兩個字符串在一本詞典的前面還是后面。先比較第一 個字符的大小(根據(jù) unicode 的值來判定),如果不分勝負(fù),就依次比較后面的內(nèi)容。
System.out.println("A".compareTo("a")); // -32 System.out.println("a".compareTo("A")); // 32 System.out.println("A".compareTo("A")); // 0 System.out.println("AB".compareTo("AC")); // -1 System.out.println("劉".compareTo("楊")); //比較結(jié)果介于unicode碼
二,字符串查找
1,contains()方法
官方文檔描述:
public boolean contains(CharSequence s)
當(dāng)且僅當(dāng)此字符串包含指定的char值序列時才返回true。
參數(shù)
s - 搜索的順序
結(jié)果
如果此字符串包含 s ,則為true,否則為false
用來判斷一個子串是否存在。
String str = "helloworld" ; System.out.println(str.contains("world")); // true
2, indexOf()方法
官方文檔描述:
public int indexOf(int ch)
返回指定字符第一次出現(xiàn)的字符串內(nèi)的索引。 如果與值的字符ch在此表示的字符序列發(fā)生String第一事件發(fā)生之對象,則索引(Unicode碼)被返回。如果此字符串中沒有此類字符,則返回-1 。
參數(shù)
ch - 一個字符(Unicode代碼點)。
結(jié)果
在通過該對象表示的字符序列的字符的第一次出現(xiàn)的索引,或 -1如果字符不會發(fā)生。
從頭開始查找指定字符串的位置,查到了就返回位置的開始索引(從0開始),如果查不到,就返回-1。
String str = "helloworld" ; System.out.println(str.indexOf("world")); // 5,w開始的索引 System.out.println(str.indexOf("bit")); // -1,沒有查到
3,startsWith()和endsWith()方法
public boolean startsWith(String prefix)
測試此字符串是否以指定的前綴開頭。
參數(shù)
prefix - 前綴。
結(jié)果
如果由參數(shù)表示的字符序列是由該字符串表示的字符序列的前綴那么返回true; 否則false。 還需要注意的是true如果參數(shù)為空字符串或等于該將被返回String如由所確定的對象equals(Object)方法。
public boolean endsWith(String suffix)
測試此字符串是否以指定的后綴結(jié)尾。
參數(shù)
suffix - 后綴。
結(jié)果
true如果由參數(shù)表示的字符序列是由該對象表示的字符序列的后綴; false否則。 注意,結(jié)果將是true如果參數(shù)是空字符串或等于該String如由所確定的對象equals(Object)方法。
String str = "**@@helloworld!!" ; System.out.println(str.startsWith("**")); // true System.out.println(str.startsWith("@@",2)); // ture System.out.println(str.endsWith("!!")); // true
三,字符串替換
replaceAll()方法
public String replaceAll(String regex,String replacement)
用給定的替換替換與給定的regular expression匹配的此字符串的每個子字符串。
請注意,替換字符串中的反斜杠( \ )和美元符號( $ )可能會導(dǎo)致結(jié)果與被視為文字替換字符串時的結(jié)果不同; 見Matcher.replaceAll 。 如果需要,使用Matcher.quoteReplacement(java.lang.String)來抑制這些字符的特殊含義。
參數(shù)
regex - 要匹配此字符串的正則表達(dá)式
replacement - 要替換每個匹配的字符串
結(jié)果
所得 String
異常
PatternSyntaxException - 如果正則表達(dá)式的語法無效
replaceAll()方法將會替換所有的指定的內(nèi)容。想要替換首個字母的話,使用replaceFirst()方法。要注意的是:由于字符串是不可變對象, 替換不修改當(dāng)前字符串, 而是產(chǎn)生一個新的字符串。
String str = "helloworld" ; System.out.println(str.replaceAll("l", "_")); //he__owor_d System.out.println(str.replaceFirst("l", "_")); //he_loworld
四,字符串拆分
字符串的拆分是常見的操作,比如在使用BufferedReader進(jìn)行數(shù)據(jù)的快速輸入輸出,這個時候,先輸入字符串,在拆分,轉(zhuǎn)格式后成為int等數(shù)據(jù)類型。
split()方法
public String[] split(String regex)
將此字符串拆分為給定的regular expression的匹配。
該方法的工作原理是通過使用給定表達(dá)式和限制參數(shù)為零調(diào)用雙參數(shù)split方法。 因此,尾隨的空字符串不會包含在結(jié)果數(shù)組中。
參數(shù)
regex - 分隔正則表達(dá)式
結(jié)果
通過將該字符串圍繞給定的正則表達(dá)式的匹配來計算的字符串?dāng)?shù)組
異常
PatternSyntaxException - 如果正則表達(dá)式的語法無效
另外有些特殊字符作為分割符可能無法正確切分, 需要加上轉(zhuǎn)義符號\\。1,字符"|","*","+"都得加上轉(zhuǎn)義字符,前面加上"\". 2,如果一個字符串中有多個分隔符,可以用"|"作為連字符。
String str = "hello world hello People" ; String[] result = str.split(" ") ; // 按照空格拆分 for(String s: result) { System.out.println(s); }
String str = "192.168.1.1" ; String[] result = str.split("\\.") ; for(String s: result) { System.out.println(s); }
String str = "name=zhangsan&age=18" ; String[] result = str.split("&") ; for (int i = 0; i < result.length; i++) { String[] temp = result[i].split("=") ; System.out.println(temp[0]+" = "+temp[1]); }
五,字符串截取
substring()方法
官方文檔描述:
public String substring(int beginIndex)
返回一個字符串,該字符串是此字符串的子字符串。 子字符串以指定索引處的字符開頭,并擴(kuò)展到該字符串的末尾。
參數(shù)
beginIndex - 開始索引(含)。
結(jié)果
指定的子字符串。
異常
IndexOutOfBoundsException 如果 beginIndex為負(fù)或大于此 String對象的長度。
該方法能夠?qū)囊粋€完整的字符串之中截取出部分內(nèi)容,從指定索引截取到結(jié)尾。要注意的是:1. 索引從0開始 2. 注意前閉后開區(qū)間的寫法, substring(0, 5) 表示包含 0 號下標(biāo)的字符, 不包含 5 號下標(biāo)。
String str = "helloworld" ; System.out.println(str.substring(5)); // world System.out.println(str.substring(0, 5));//hello
六,字符串其他常見的操作方法
這些常見的操作方法比如:取得字符串的長度,去掉字符串兩邊的空格,保留中間的空格,字符串大小寫轉(zhuǎn)換,字符串反轉(zhuǎn)。
1,trim()方法
官方文檔描述:
public String trim()
返回一個字符串,其值為此字符串,并刪除任何前導(dǎo)和尾隨空格。
如果此String對象表示一個空字符序列,或由該代表字符序列的第一個和最后一個字符String對象都具有代碼大于'\u0020' (空格字符),則此參考String被返回對象。
否則,如果字符串中沒有字符大于'\u0020'的字符,則返回一個表示空字符串的String對象。
否則,令k為代碼大于'\u0020'的字符串中第一個字符的'\u0020' ,并且m為代碼大于'\u0020'的字符串中最后一個字符的'\u0020' 。 將返回一個String對象,表示該字符串的子字符串,以索引k處的字符開頭,以索引m為止的字符結(jié)束,結(jié)果為this.substring(k, m + 1) 。
此方法可用于從字符串的開始和結(jié)尾修剪空格(如上定義)。
結(jié)果
一個字符串,其值是此字符串,除去任何前導(dǎo)和尾隨空格,或者如果該字符串沒有前導(dǎo)或尾隨的空格,則為該字符串。
trim()方法會去掉字符串開頭和結(jié)尾的空白字符(空格, 換行, 制表符等)。
String str = " hello world " ; System.out.println("["+str+"]"); System.out.println("["+str.trim()+"]");
2,toUpperCase()和toLowerCase()方法
官方文檔描述:
public String toUpperCase(Locale locale)
參數(shù)
locale - 使用此區(qū)域設(shè)置的案例轉(zhuǎn)換規(guī)則
結(jié)果
String,轉(zhuǎn)換成大寫。
public String toLowerCase(Locale locale)
參數(shù)
locale - 使用此區(qū)域設(shè)置的案例轉(zhuǎn)換規(guī)則
結(jié)果
String ,轉(zhuǎn)換成小寫。
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.toUpperCase()); // HELLO%$$%@#$%WORLD 哈哈哈 System.out.println(str.toLowerCase()); // hello%$$%@#$%world 哈哈哈
3,length()方法
官方文檔描述:
public int length()
返回此字符串的長度。 長度等于字符串中的數(shù)字Unicode code units 。
結(jié)果
由該對象表示的字符序列的長度。
注意:數(shù)組長度使用數(shù)組名稱.length屬性,而String中使用的是length()方法。
String str = " hello%$$%@#$%world 哈哈哈 " ; System.out.println(str.length()); //24
3,reverse()方法
String類不提供reverse()方法,該方法存在于StringBuffer和StringBuilder類當(dāng)中。要使用該方法,就要new出由他們生成的對象來使用。StringBuffer和StringBuilder二者非常相似,在這里,用StringBuffer來說明。
官方文檔描述:
public StringBuilder reverse()
導(dǎo)致該字符序列被序列的相反代替。 如果序列中包含任何替代對,則將它們視為單個字符進(jìn)行反向操作。
結(jié)果
對這個對象的引用
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.reverse()); //dlrowolleh
到此這篇關(guān)于Java字符串常見的操作(比較,查找,替換等)的文章就介紹到這了,更多相關(guān)Java字符串操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談三分鐘學(xué)習(xí)Java泛型中T、E、K、V、?的含義
這篇文章主要介紹了淺談三分鐘學(xué)習(xí)Java泛型中T、E、K、V、?的含義,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12SpringBoot使用prometheus監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03mybatis?plus配置自動create_time和update_time方式
在處理數(shù)據(jù)時,注意時間類型的轉(zhuǎn)換非常重要,不同編程環(huán)境和數(shù)據(jù)庫對時間數(shù)據(jù)的處理方式各異,因此在數(shù)據(jù)遷移或日常處理中需謹(jǐn)慎處理時間格式,個人經(jīng)驗表明,了解常用的時間轉(zhuǎn)換函數(shù)和方法能有效避免錯誤,提高工作效率,希望這些經(jīng)驗?zāi)転榇蠹規(guī)韼椭?/div> 2024-09-09從零到掌握Spring Boot Validation 接口校驗的詳細(xì)過程
本文詳細(xì)介紹了SpringBoot的Validation接口校驗機(jī)制,包括其核心功能、常用注解、自定義校驗、以及實際應(yīng)用場景,通過注解定義數(shù)據(jù)校驗規(guī)則,感興趣的朋友跟隨小編一起看看吧2025-02-02如何巧用HashMap一行代碼統(tǒng)計單詞出現(xiàn)次數(shù)詳解
這篇文章主要給大家介紹了關(guān)于如何巧用HashMap一行代碼統(tǒng)計單詞出現(xiàn)次數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07最新評論