Java字符串相關類操作方法詳解
一、String
1.Java中的數(shù)據(jù)類型
在Java中數(shù)據(jù)類型被分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。
- 基本數(shù)據(jù)類型:數(shù)值存儲在自己的空間而不是堆內存或其他的空間中,如int、float、double、boolean等
- 引用數(shù)據(jù)類型:數(shù)值存儲在其他的空間,本身的空間存儲的是地址值,如數(shù)組、創(chuàng)建的對象、字符串等。
在本節(jié)中,我們將介紹的字符串就是一種引用數(shù)據(jù)類型。
2.字符串概述
a.在Java中所有字符串的定義都在java.lang.String中,在使用String定義字符串時應先導包。
//導包 java.lang.String; //定義 String s = "abcdef";
b.字符串參與的所有運算都屬于字符串的拼接操作。由于字符串的內容自創(chuàng)建之后就不能改變,所以每次執(zhí)行字符串的拼接操作時都會在內存中重新申請空間儲存拼接后的字符串。
String s1 = "abc"; String s2 = "123"; System.out.println(s1+s2);//執(zhí)行結果:abc123
在執(zhí)行上面的代碼時一共產生了三個字符串,分別是s1("abc")、s2("123")以及拼接后新產生的字符串"abc123"。
String s1 = "abc"; s1="三連+關注"; System.out.println(s1);//執(zhí)行結果:三連+關注
c.字符串的值被創(chuàng)建后是無法改變的,因此在執(zhí)行上面的代碼時并沒有改變"abc"里原本的內容,而是創(chuàng)建了一個新的字符串"三連+關注"并重新賦值給了s1。
d.對于沒有變量參與的字符串拼接操作是不同于有變量參與的拼接操作的。
- 如果沒有變量參與,系統(tǒng)會檢查串池,如果串池中有該字符串,直接復用,沒有再開辟新的內存空間。
- 如果有變量參與,每一行代碼都會創(chuàng)建新的字符串。
3.字符串構造方法
a.直接定義
String s1 = "abc"; System.out.println(s1);//執(zhí)行結果:abc
b.通過new關鍵字獲取一個空字符串
String s1 = new String(); System.out.println("!"+s1+"!");//執(zhí)行結果:!!
c.傳遞一個字符串,根據(jù)傳遞的字符串再構造一個新的字符串
String s1 = new String("abc"); System.out.println(s1);//執(zhí)行結果:abc
d.傳遞一個字符數(shù)組,根據(jù)字符數(shù)組的內容構造新的字符串
char[] ch = {'a','b','c'}; String s1 = new String(ch); System.out.println(s1);//執(zhí)行結果:abc
e.傳遞一個字節(jié)數(shù)組,根據(jù)字節(jié)數(shù)組的內容構造新的字符串
byte[] by = {97,98,'c'}; String s1 = new String(by); System.out.println(s1);//執(zhí)行結果:abc
在字節(jié)數(shù)組中,97和98不再代表整形,而是ASCII碼表中碼值為97、98的符號,即a、b。
4.字符串構造內存原理
在Java中內存主要被分為棧、堆、方法區(qū)三部分(如下圖)。
- 棧:主要存儲方法,方法開始執(zhí)行時進棧,結束執(zhí)時出棧。
- 堆:存儲對象或數(shù)組,使用new關鍵字時是在堆內存中開辟了空間。從鍵盤獲取的字符串也是存儲在堆中。
- 方法區(qū):存儲可執(zhí)行的class文件。
在堆內存中,有一塊被稱作串池(String Table)的內存空間,它是專門用來存儲字符串的內存空間。
如果選擇直接賦值(參考2.a)的形式構造字符串,系統(tǒng)會在串池中檢查,如果兩個字符串的內容完全相同,則直接服用已經構造好的字符串,而不會重新開辟空間存儲,減少了空間浪費。
String s2 = "abc"; String s1 = "abc";//s1和s2中地址值是一樣的
而如果使用new關鍵字構造,系統(tǒng)不會檢查串池并直接在堆空間中開辟內存。
String s2 = new String("abc"); String s1 = new String("abc");//使用new關鍵字構造的字符串地址不同
5.字符串比較
a.如果直接用==符號比較,可能并不能反饋正確的結果。由String定義的字符串是一種引用數(shù)據(jù)類型,在String創(chuàng)建的對象本身的空間中存儲的是地址值,而不是數(shù)據(jù),==符號比較的是對象本身內存中的數(shù)據(jù),因此可能會輸出錯誤的結果。
Scanner sc = new Scanner(System.in);//在鍵盤上輸入"abc",輸入的數(shù)據(jù)是存儲在堆內存中的 String s1 = sc.next(); String s2 = "abc"; System.out.println(s1==s2);//執(zhí)行結果:false
b.比較兩個字符串內容是否相同可以使用String類中的equals方法。
Scanner sc = new Scanner(System.in);//輸入"abc" String s1 = sc.next(); String s2 = "abc"; boolean res = s1.equals(s2);//equals的返回值是boolean類型 System.out.println(res);//執(zhí)行結果:true
c.比較兩個字符串內容是否相同且忽略大小寫,使用String類中的equalsIgnoreCase方法。此處的忽略大小寫只針對于英文字母而不針對于中文(如"1"和"一")。
Scanner sc = new Scanner(System.in);//輸入"abc" String s1 = sc.next(); String s2 = "Abc"; boolean res = s1.equalsIgnoreCase(s2); System.out.println(res);//執(zhí)行結果:true
6.字符串常見方法
- public char charAt(int index);
- 根據(jù)索引(索引下標從0開始)返回字符。
String s1 = "abcde"; char ch = s1.charAt(0); System.out.println(ch);//執(zhí)行結果:a
- public int length();
- 返回字符串的長度。
String s1 = "abcde"; int len = s1.length(); System.out.println(len);//執(zhí)行結果:5
- String substring(int begin,int end);
- 從字符串中截取并返回下標從begin開始到end-1(不包含end)結束的字符串。
String s1 = "abcde"; String subs1 = s1.substring(0,2);//截取下標從0~1的字符串 System.out.println(subs1);//執(zhí)行結果:ab
二、StringBuilder
1.定義
StringBuilder可以看作一個容器,不同于String,用StringBuilder創(chuàng)建的對象內容是可變的,它可以提高字符串的操作效率。
StringBuilder sb = new StringBuilder();
括號中可傳參可不傳參。
2.常用方法
- toString();
- 將StringBuilder類型的對象轉換為String類型。
StringBuilder sb = new StringBuilder("abc"); String s1 = sb.toString(); System.out.println(s1);//執(zhí)行結果:abc
需要注意的是,通過StringBuilder創(chuàng)建的對象無法直接使用String中的方法,需要經過toString轉換才能使用String中的方法。
- append();
- 向StringBuilder創(chuàng)建的對象中添加數(shù)據(jù)。
StringBuilder sb = new StringBuilder("abc"); System.out.println(sb.toString());//執(zhí)行結果:abc sb.append("123"); System.out.println(sb.toString());//執(zhí)行結果:abc123
- reverse();
- 反轉對象中的數(shù)據(jù)。
StringBuilder sb = new StringBuilder("abc123"); System.out.println(sb.toString());//執(zhí)行結果:abc123 sb.reverse(); System.out.println(sb.toString());//執(zhí)行結果:321cba
- length();
- 返回容器中字符串的長度。
StringBuilder sb = new StringBuilder("abc123"); int len = sb.length(); System.out.println(len);//執(zhí)行結果:6
- capacity();
- 返回目前容器的容量。一個空的StringBuilder對象默認容量時16.
StringBuilder sb = new StringBuilder(); System.out.println(sb.capacity());//執(zhí)行結果:16
3.StringBuilder內存分析
在創(chuàng)建StringBuilder的對象時,在內存中默認開辟容量為16的字節(jié)數(shù)組,如果載入的數(shù)據(jù)超容,則系統(tǒng)會自動 為StringBuilder擴容,新容量=老容量*2+2=34;如果新數(shù)據(jù)超容且超出自動擴容時的容量,那么新的容量以實際為準。
需要注意的是,capacity指的是容器能容納數(shù)據(jù)的空間大小,而length可以理解為存儲在容器中的有效數(shù)據(jù)的長度。
- 初始容量:16
StringBuilder sb = new StringBuilder(); System.out.println(sb.capacity());//執(zhí)行結果:16
- 數(shù)據(jù)內存沒有超出默認擴容的內存空間(34)
sb.append("abcdefghijklmnopq"); System.out.println(sb.length());//執(zhí)行結果:17 System.out.println(sb.capacity());//執(zhí)行結果:34
- 數(shù)據(jù)內存超出了默認擴容的內存空間
sb.append("abcdefghijklmnopqrstuvwxyz123456789"); System.out.println(sb.length());//執(zhí)行結果:35 System.out.println(sb.capacity());//執(zhí)行結果:35
三、StringJoiner
1.定義
StringJoiner和StringBuilder一樣。都可以看作一種容器,創(chuàng)建之后里面的內容是可變的。StringJoiner的代碼編寫十分簡潔,可以快速有效的完成程序員指定的字符串拼接操作。StringJoiner是不支持空參構造的。
- StringJoiner sj = new StringJoiner("---");
- 創(chuàng)建一個對象,指定拼接時的間隔符號("---")。
StringJoiner sj = new StringJoiner("---");
- StringJoiner sj = new StringJoiner("---", "[", "]");
- 創(chuàng)建一個對象,指定拼接時的間隔符號("---")、開始符號("[")、結束符號("]")。
StringJoiner sj = new StringJoiner("---","[","]");
2.常用方法
- public StringJoiner add(添加的內容);
- 添加數(shù)據(jù),并返回數(shù)據(jù)本身
StringJoiner sj = new StringJoiner("---","[","]"); sj.add("aaa"); sj.add("bbb"); sj.add("ccc"); System.out.println(sj);//執(zhí)行結果:[aaa---bbb---ccc]
- public int length();
- 返回長度。這里的length同時包含間隔符號、開始符號、結束符號在內。
StringJoiner sj = new StringJoiner("---","[","]"); sj.add("aaa"); sj.add("bbb"); sj.add("ccc"); int len = sj.length(); System.out.println(len);//執(zhí)行結果:17
- public String toString();
- 返回一個字符串。
總結
到此這篇關于Java字符串相關類操作方法詳解的文章就介紹到這了,更多相關Java字符串相關類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何解決IDEA使用Tomcat控制臺中文出現(xiàn)亂碼問題
這篇文章主要介紹了如何解決IDEA使用Tomcat控制臺中文出現(xiàn)亂碼問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09MyBatis-Plus+達夢數(shù)據(jù)庫實現(xiàn)高效數(shù)據(jù)持久化的示例
這篇文章主要介紹了MyBatis-Plus和達夢數(shù)據(jù)庫實現(xiàn)高效數(shù)據(jù)持久化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08java http連接池的實現(xiàn)方式(帶有失敗重試等高級功能)
這篇文章主要介紹了java http連接池的實現(xiàn)方式(帶有失敗重試等高級功能),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04解決在啟動eclipse的tomcat進行訪問時出現(xiàn)404問題的方法
這篇文章主要介紹了解決在啟動eclipse的tomcat進行訪問時出現(xiàn)404問題的方法,感興趣的小伙伴們可以參考一下2016-04-04IDEA編寫SpringBoot項目時使用Lombok報錯“找不到符號”的原因和解決
本文主要介紹了IDEA編寫SpringBoot項目時使用Lombok報錯“找不到符號”,詳細介紹了幾種可能會出現(xiàn)的問題及其解決方法,具有一定的參考價值,感興趣的可以了解一下2025-03-03