面試題
- String為什么不可變?
答案
/*
1.Java中String類維護(hù)一個(gè)final修飾的char[]數(shù)組實(shí)現(xiàn)不可變,意味著一旦分配了內(nèi)存空間,它們就不能被修改。
2.我們所說的不可變指的是字符串池中的對(duì)象是不可更改的(這樣方便JVM的內(nèi)存管理) 但當(dāng)前變量可以修改指向
eg1.當(dāng)我們創(chuàng)建String實(shí)例的時(shí)候 字符串中存在-->返回引用,而不是開辟新的對(duì)象空間 不存在-->字符串中開辟對(duì)象空間并返回引用
eg2.當(dāng)我們使用String中的方法來對(duì)其進(jìn)行操作時(shí),例如使用 replace() 方法修改字符串內(nèi)容時(shí),實(shí)際上是創(chuàng)建了一個(gè)新的字符串對(duì)象,并將其返回。
原始的字符串本身并沒有被修改,只是改變了指向該字符串的引用。這種設(shè)計(jì)保證了在多線程環(huán)境下,String對(duì)象不會(huì)被修改,從而提高了代碼的可靠性和安全性。
*/
- String s1=new String("abc");創(chuàng)建了幾個(gè)字符串對(duì)象
答案
/*
創(chuàng)建一個(gè)字符串對(duì)象
在Java中,使用 String s = "abc" 方式創(chuàng)建的字符串常量在編譯期就已經(jīng)被確定并放入常量池中,
因此,如果使用 String s = "abc" 創(chuàng)建多個(gè)字符串對(duì)象時(shí),實(shí)際上只有一個(gè)對(duì)象會(huì)被創(chuàng)建。
而使用 String s = new String("abc") 方式創(chuàng)建的字符串對(duì)象則是在運(yùn)行時(shí)創(chuàng)建的,每次都會(huì)在堆中創(chuàng)建一個(gè)新的對(duì)象,
因此在本例中,該語(yǔ)句創(chuàng)建了一個(gè)在堆中的字符串對(duì)象
*/
String類部分源碼
//被final修飾不可被繼承
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//String維護(hù)char[] 所以不可修改
private final char value[];
創(chuàng)建String對(duì)象的方式
- str1它首先會(huì)去方法區(qū)的常量池中找,有“hello”這個(gè)對(duì)象就直接引用,沒有就創(chuàng)建一個(gè)新的對(duì)象“hello”,存放在常量池中。
- 而new的方式首先會(huì)在堆中創(chuàng)建一個(gè)對(duì)象,然后再去常量池中找,有直接引用,沒有就創(chuàng)建一個(gè)新的對(duì)象“hello”。
兩者區(qū)別
- 直接賦值創(chuàng)建0或1個(gè)對(duì)象,而new的方式創(chuàng)建1或2個(gè)對(duì)象。
- 為了提升Java虛擬機(jī)的性能和減少內(nèi)存的開銷,避免字符串的重復(fù)創(chuàng)建,盡量少使用new的方式創(chuàng)建String對(duì)象
代碼分析
public static void main(String[] args) {
String str1 = "hello";//指向常量池中的引用
String str2 = new String("hello");//指向堆中的引用
String str3 = str2;//str3==str2 true
String str4 = "hello";//str1==str4 true
}
intern()
字符串調(diào)用intern()會(huì)返回常量池中這個(gè)字符串引用,可作為鎖對(duì)象文章來源:http://www.zghlxwxcb.cn/news/detail-426027.html
字符串拼接
String a="A";
String b="B";
String c=new String("C");
a="A"+b;//變量拼接 指向變?yōu)槎阎械刂?a="A"+c;//變量拼接 指向變?yōu)槎阎械刂罚?a="A"+"A";//常量拼接依舊指向常量池中的地址 a=="AA" true
final String d="D";//這是常量
a="A"+d//a=="AD" true
+號(hào)變量拼接底層原理 StringBuidlerd構(gòu)造初始化容量為16的char[] 然后調(diào)用append()進(jìn)行拼接 最后將結(jié)果new String()的形式賦給左邊變量文章來源地址http://www.zghlxwxcb.cn/news/detail-426027.html
到了這里,關(guān)于Java中關(guān)于String類以及字符串拼接的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!