Java詳細(xì)分析String類與StringBuffer和StringBuilder的使用方法
String類基本概念
- String類屬于引用數(shù)據(jù)類型,不屬于基本數(shù)據(jù)類型。
- 在Java中只要是" "(雙引號(hào))中的,都是String對(duì)象。
- java中規(guī)定,雙引號(hào)中的字符串是不可變的,也就是說"abc"自出生到死亡都不可能變成"abcd",也不能變成"ab"。
- 在JDK中雙引號(hào)括起來的字符串都是存儲(chǔ)在方法區(qū)的字符串常量池當(dāng)中的。(因?yàn)樵趯?shí)際開發(fā)中,字符串的使用頻率十分高,為了執(zhí)行效率,就把字符串放在了方法區(qū)中的字符串常量池當(dāng)中)
String字符串的存儲(chǔ)原理
- 通過 String s = “abc” 這種方式,會(huì)在方法區(qū)中的字符串常量池創(chuàng)建對(duì)象,s會(huì)保存該字符串在字符串常量池中的地址。
- 通過 String s = new String(“abc”)的方式創(chuàng)建對(duì)象,首先會(huì)在字符串常量池中創(chuàng)建"abc"對(duì)象(如果字符串常量池中已經(jīng)有了"abc"則不會(huì)再次創(chuàng)建),然后會(huì)在堆區(qū)創(chuàng)建String類對(duì)象,它會(huì)儲(chǔ)存" abc "在方法區(qū)中的地址,s又會(huì)保存堆中String對(duì)象的地址。
看以下代碼:
public class StringTest01 {
//這兩行代碼表示創(chuàng)建3個(gè)字符串對(duì)象,且都在字符串常量池中
String A = "abc";
String B = "abc" + "de";
//通過 new 來創(chuàng)建字符串對(duì)象,會(huì)先在字符串常量池中尋找"abc"
//找不到的話就會(huì)在字符串常量池中創(chuàng)建一個(gè)"abc"對(duì)象
//在堆中創(chuàng)建創(chuàng)建字符串對(duì)象,并且保存"abc"在字符串常量池中的地址
String C = new String("abc");
}
按照以上代碼畫出JVM內(nèi)存簡圖如下:

知道了String類字符串的存儲(chǔ)原理之后,就可以很容易知道以下代碼的編譯結(jié)果:
public class StringTest01 {
public static void main(String[] args) {
//沒有在堆中創(chuàng)建對(duì)象
//s1與s2都存的是"hello"在字符串常量池中的地址
String s1 = "hello";
String s2 = "hello";
//在堆中創(chuàng)建了對(duì)象
//m,n分別存的是他們?cè)诙阎袑?duì)象的地址
String m = new String("你好!");
String n = new String("你好!");
System.out.println(s1 == s2);//結(jié)果為true
System.out.println(m == n);//結(jié)果為false
}
}
String類的常用構(gòu)造方法
//String類構(gòu)造方法的使用
public class StringTest02 {
public static void main(String[] args) {
byte []x1 = { 97 , 98 , 99 };
char []x2 = {'我','是','中','國','人'};
//String s = new String(byte數(shù)組);
String y1 = new String(x1);
System.out.println(y1);//ABC
//String s = new String(byte數(shù)組,偏移量,長度)
String y2 = new String(x1,1,2);
System.out.println(y2);//BC
//String s = new String(char數(shù)組)
String y3 = new String(x2);
System.out.println(y3);//我是中國人
//String s = new String(char數(shù)組,偏移量,長度)
String y4 = new String(x2,2,3);
System.out.println(y4);//中國人
}
}String類中常用方法
public class StringTest03 {
public static void main(String[] args) {
//public char charAt(int index)方法
//返回索引值處的char類型字符
char s1 = "中國人".charAt(1);
System.out.println(s1);//國
//public int compareTo(String anotherString)方法
//按字典序比較兩個(gè)字符串
System.out.println("abc".compareTo("abd"));//負(fù)整數(shù)
System.out.println("abc".compareTo("abc"));//0
System.out.println("abc".compareTo("abb"));//正整數(shù)
//public boolean contains(CharSequence s)方法
//判斷字符串是否包含s
System.out.println("abcdefg".contains("efg"));//true
System.out.println("abcdefg".contains("hij"));//false
//public boolean endsWith(String suffix)方法
//判斷字符串是否以suffix結(jié)尾
System.out.println("abcde".endsWith("cde"));//true
System.out.println("abcde".endsWith("qwe"));//false
//public boolean equalsIgnoreCase(String anotherString) 方法
//判斷兩個(gè)字符串是否相等,忽略大小寫
System.out.println("ABcd".equalsIgnoreCase("abCD"));//true
//public byte[] getBytes()
//將字符串轉(zhuǎn)換成byte數(shù)組,并返回
byte [] s2 = "abcdefg".getBytes();
for (int i = 0; i < s2.length; i++) {
System.out.print(s2[i] + " ");
}//97 98 99 100 101 102 103
//public int indexOf(String str)
//判斷某個(gè)子字符串在當(dāng)前字符串中第一次出現(xiàn)處的索引
//若子字符串不存在,返回-1
System.out.println("abcdefghigk".indexOf("hig"));//7
System.out.println("abc".indexOf("fgh"));//-1
//public int lastIndexOf(String str)
//判斷某個(gè)子字符串最后一次出現(xiàn)在當(dāng)前字符串中的索引
System.out.println("abcdhdhdabc".lastIndexOf("abc"));//8
//public boolean isEmpty()
//判斷字符串是否為空串
//底層調(diào)用length()方法,空串長度為0
//注意:判斷數(shù)組長度是length屬性,判斷字符串長度是length()方法
System.out.println("".isEmpty());//true
//public String replace(char oldChar,char newChar)
//返回一個(gè)將原字符串中所有的oldChar替換為newChar的新字符串,不改變?cè)址?
String s3 = "aaatttooo";
System.out.println( s3.replace('t','q'));//aaaqqqooo
//public String replace(CharSequence target,CharSequence replacement)
//CharSequence可以看出String
//將原字符串中的 target 全部換成 replacement
String s4 = "abcsgdjsssjabcjdjjdjabc";
System.out.println(s4.replace("abc","www"));//wwwsgdjsssjwwwjdjjdjwww
//public String[] split(String regex)
//以regex為分界線,將字符串分割保存在一個(gè)字符串?dāng)?shù)組當(dāng)中,并返回
String s5 = "2022-3-19";
String [] str = s5.split("-");
System.out.println(str[0] + str[1] + str[2]);//2022319
//public String substring(int beginIndex)
//返回一個(gè)以索引beginIndex開始直至結(jié)尾的字符串
System.out.println("abcdefgh".substring(4));//efgh
//public String substring(int beginIndex,int endIndex)
//返回一個(gè)以索引值beginIndex開始,以索引值endIndex結(jié)束(不包含該索引值處的字符)的子字符串
System.out.println("abcdefgh".substring(2,5));//cde
//public char[] toCharArray()
//將一個(gè)字符串以字符數(shù)組的形式返回
char[] str2 = "abcdefg".toCharArray();
for(int i = 0 ; i < str2.length ; i++){
System.out.println(str2[i]);
}
//public String toLowerCase()
//返回一個(gè)將原字符串中所有字符變成小寫的新字符串
System.out.println("ABcDeFG".toLowerCase());//abcdefg
//public String toUpperCase()
//返回一個(gè)將原字符串中所有字符變成大寫的新字符串
System.out.println("aCbcdEfg".toUpperCase());//ABCDEFG
//public String trim()
// 返回一個(gè)去除字符串的前后空白(空格)的新字符串
System.out.println(" abcdefg ".trim());//abcdefg
//public static String valueOf(參數(shù)列表)
//參數(shù)列表可以是int型,char型,int數(shù)組,對(duì)象 等等.......
//String類中唯一一個(gè)靜態(tài)方法,可以直接調(diào)用
//將非字符串轉(zhuǎn)換為字符串
//println()底層調(diào)用的就是valueOf()方法,只要是打印在控制臺(tái)上的都是字符串
System.out.println(String.valueOf(true));
}
}StringBuffer類
思考:
- 頻繁使用字符串拼接會(huì)有什么影響?
- java中字符串是不可變的,每拼接一次都會(huì)產(chǎn)生一個(gè)新的字符串
- 字符串是存在字符串常量池中的,頻繁使用字符串拼接會(huì)占用大量的方法區(qū)空間
為了避免以上問題我們就可以使用到StringBuffer類
//java.lang.StringBuffer
public class StringBufferTest {
public static void main(String[] args) {
//創(chuàng)建一個(gè)初始化容量為16個(gè) byte[] 數(shù)組(字符串緩沖區(qū)對(duì)象)
StringBuffer strBuffer = new StringBuffer();
//拼接字符串調(diào)用 append()方法
//append()方法底層會(huì)調(diào)用 System.arraycopy()方法,效率較低
//append()再追加時(shí),如果byte[]滿了之后會(huì)自動(dòng)擴(kuò)容
strBuffer.append(1);
strBuffer.append('q');
strBuffer.append(3.14);
strBuffer.append("abc");
System.out.println(strBuffer);//1q3.14abc
//StringBuffer可以進(jìn)行一定的優(yōu)化
//在創(chuàng)建StringBuffer時(shí)盡可能可能給定一個(gè)合適的初始化容量
//從而減少底層數(shù)組的擴(kuò)容次數(shù)
//指定初始化容量的字符串緩沖區(qū)
StringBuffer newstrBuffer = new StringBuffer(100);
}
}StringBuilder類
它的用法與StringBuffer十分相似,但是也有很大的區(qū)別:
- StringBuffer中的方法都有synchronized關(guān)鍵字修飾,表示StringBuffer在多線程編譯環(huán)境下是安全的
- StringBuilder中方法沒有synchronized關(guān)鍵字修飾,表示StringBuilder在多線程編譯環(huán)境下是不安全的
到此這篇關(guān)于Java詳細(xì)分析String類與StringBuffer和StringBuilder的使用方法的文章就介紹到這了,更多相關(guān)Java String類用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中String、StringBuffer和StringBuilder的區(qū)別
- Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解
- Java中StringBuilder與StringBuffer的區(qū)別
- Java中StringBuilder與StringBuffer使用及源碼解讀
- 淺析Java中StringBuffer和StringBuilder的使用
- Java StringBuffer與StringBuilder有什么區(qū)別
- 詳解Java中String,StringBuffer和StringBuilder的使用
- Java中String和StringBuffer及StringBuilder?有什么區(qū)別
- Java源碼深度分析String與StringBuffer及StringBuilder詳解
- Java中String、StringBuffer和StringBuilder的區(qū)別與使用場景
相關(guān)文章
Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析
這篇文章主要介紹了Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java基礎(chǔ)鞏固小項(xiàng)目點(diǎn)菜系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了一個(gè)Java小項(xiàng)目點(diǎn)菜系統(tǒng)的實(shí)現(xiàn),主要是用的集合,適合正在學(xué)習(xí)Java的朋友拿來實(shí)戰(zhàn)練手,感興趣的朋友快來看看吧2022-03-03
關(guān)于@OnetoMany關(guān)系映射的排序問題,使用注解@OrderBy
這篇文章主要介紹了關(guān)于@OnetoMany關(guān)系映射的排序問題,使用注解@OrderBy,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot打包發(fā)布到linux上(centos 7)的步驟
這篇文章主要介紹了SpringBoot打包發(fā)布到linux上(centos 7)的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-12-12
maven報(bào)錯(cuò):Failed to execute goal on p
這篇文章主要介紹了maven報(bào)錯(cuò):Failed to execute goal on project問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問題解決
這篇文章主要介紹了SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01

