查看API文檔我們可以發(fā)現(xiàn),String類代表字符串,Java程序中的所有字符串字面值(如”abc”)都作為此類的實例實現(xiàn)。
其實就是說:程序當(dāng)中所有的雙引號字符串,都是String類的對象。(就算沒有new,也照樣是。)
String字符串的特點:
1.字符串的內(nèi)容永不可變。
2.因為String對象是不可變的,所以共享。
3.字符串效果上相當(dāng)于是char[]字符數(shù)組,但是底層原理是byte[]字節(jié)數(shù)組。
創(chuàng)建字符串的常見3+1種方式:
三種構(gòu)造方法:
public String():創(chuàng)建一個空白字符串,不含有任何內(nèi)容
public String(char[] array):根據(jù)字符數(shù)組的內(nèi)容,來創(chuàng)建對應(yīng)的字符串。
public String(byte[] array):根據(jù)字節(jié)數(shù)組的內(nèi)容,來創(chuàng)建對應(yīng)的字符串。
一種直接創(chuàng)建:
String str = "Hello":右邊直接用雙引號
注意:直接寫上雙引號,就是字符串對象。
public static void main(String[] args) {
// 使用空參構(gòu)造
String str1 = new String(); // 小括號留空,說明字符串什么內(nèi)容都沒有
System.out.println("第一個字符串:" + str1);
// 根據(jù)字符數(shù)組的內(nèi)容來創(chuàng)建對應(yīng)的字符串
char[] charArray = {'A','B','C'};
String str2 = new String(charArray);
System.out.println("第二個字符串:" + str2); // 注意是拼接數(shù)組元素,沒有存入逗號
// 根據(jù)字節(jié)數(shù)組的內(nèi)容來創(chuàng)建對應(yīng)的字符串
// 小范圍到大范圍,范圍沒超,byte類型:ASCII碼隱式強(qiáng)制轉(zhuǎn)換
// 回憶知識點:65--A;97--a;48--0
byte[] byteArray = {97,98,99};
String str3 = new String(byteArray); // 查看源碼ctrl+點擊
System.out.println("第三個字符串:" + str3);
String str4 = "Hello";
System.out.println("第三個字符串:" + str3);
}
我們來分析這個代碼在內(nèi)存里的走向。
首先提一個關(guān)于JDK迭代知識點:
JDK1.7之前,運行時常量池(字符串常量池也在里面)是存放在方法區(qū),此時方法區(qū)的實現(xiàn)是永久帶。
JDK1.7,字符串常量池被單獨從方法區(qū)移到堆里,運行時常量池剩下的還在永久帶(方法區(qū))。
JDK1.8,永久帶更名為元空間(方法區(qū)的新實現(xiàn)),但字符串常量池還在堆里,運行時常量池在元空間(方法區(qū))。
字符串常量池當(dāng)中的字符串對象保存的是byte[]字節(jié)數(shù)組的地址值。
JVM幫忙創(chuàng)建雙引號內(nèi)的字符串對象時,是先將它化作一個字節(jié)數(shù)組,再把字節(jié)數(shù)組的地址值保存在字符串常量池中的這個字符串對象里,然后把池中的字符串對象的地址賦值給棧里的局部變量。
而創(chuàng)建char[]數(shù)組的對象時,也相當(dāng)于在堆里new出來的一個數(shù)組,找到地址賦值,但注意并不在常量池里。
最后在堆里根據(jù)char[]數(shù)組new一個字符串對象時,是先將這個在堆里的char[]數(shù)組轉(zhuǎn)換為字節(jié)數(shù)組,然后在堆里new出一個字符串對象,將這個字節(jié)數(shù)組的地址賦值給字符串對象,然后將字符串對象的地址賦值給局部變量。

注意事項:
1.對于基本類型的數(shù)據(jù)來說,==進(jìn)行的是數(shù)值比較;對于引用類型來說,==進(jìn)行的是地址值的比較。
2.雙引號直接寫的字符串在常量池中,new的不在池中(但都在堆中)。
————————————————
版權(quán)聲明:本文為CSDN博主「wardoluo」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wardo_l/article/details/113824135