收集Java面试题知识点(Java基础部分三)
1、String s = “Hello”;s = s + ” world!”;這兩行代碼執(zhí)行后,原始的String對(duì)象中的內(nèi)容到底變了沒(méi)有?
沒(méi)有。因?yàn)镾tring被設(shè)計(jì)成不可變(immutable)類,所以它的所有對(duì)象都是不可變對(duì)象。在這段代碼中,s原先指向一個(gè)String對(duì)象,內(nèi)容是 “Hello”,然后我們對(duì)s進(jìn)行了+操作,那么s所指向的那個(gè)對(duì)象是否發(fā)生了改變呢?答案是沒(méi)有。這時(shí),s不指向原來(lái)那個(gè)對(duì)象了,而指向了另一個(gè) String對(duì)象,內(nèi)容為”Hello world!”,原來(lái)那個(gè)對(duì)象還存在于內(nèi)存之中,只是s這個(gè)引用變量不再指向它了。
通過(guò)上面的說(shuō)明,我們很容易導(dǎo)出另一個(gè)結(jié)論,如果經(jīng)常對(duì)字符串進(jìn)行各種各樣的修改,或者說(shuō),不可預(yù)見(jiàn)的修改,那么使用String來(lái)代表字符串的話會(huì)引起很大的內(nèi)存開(kāi)銷。因?yàn)?String對(duì)象建立之后不能再改變,所以對(duì)于每一個(gè)不同的字符串,都需要一個(gè)String對(duì)象來(lái)表示。這時(shí),應(yīng)該考慮使用StringBuffer類,它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對(duì)象。并且,這兩種類的對(duì)象轉(zhuǎn)換十分容易。
實(shí)際上,當(dāng)我們需要一個(gè)字符串對(duì)象時(shí),應(yīng)該使用如下語(yǔ)法來(lái)創(chuàng)建String對(duì)象:
Sring s = “fkjava.org”;
也就是直接使用字符串直接量的語(yǔ)法。而不是:
String s = new String(“fkjava.org”);
對(duì)于第二種語(yǔ)法而言,每次都會(huì)調(diào)用構(gòu)造器生成新的String對(duì)象,性能低下且內(nèi)存開(kāi)銷大,并且沒(méi)有意義,因?yàn)镾tring對(duì)象不可改變,所以對(duì)于內(nèi)容相同的字符串,只要一個(gè)String對(duì)象來(lái)表示就可以了。
基于這樣一種想法,Java提供了字符串緩存池來(lái)管理字符串直接量,當(dāng)程序多次用到同一個(gè)字符串直接量時(shí),系統(tǒng)會(huì)讓它們都引用字符串緩存池中的同一個(gè)String對(duì)象。因此使用在程序中使用字符串直接量可以充分利用這個(gè)特性來(lái)降低系統(tǒng)內(nèi)存開(kāi)銷,提高程序性能。
2、下面這條語(yǔ)句一共創(chuàng)建了多少個(gè)對(duì)象:String s=”a”+”b”+”c”+”d”;
答案是
就創(chuàng)建了一個(gè)
String s = "a" + "b" + "c" + "d" + "e";
賦值符號(hào)右邊的"a"、"b"、"c"、"d"、"e"都是常量
對(duì)于常量,編譯時(shí)就直接存儲(chǔ)它們的字面值而不是它們的引用
在編譯時(shí)就直接講它們連接的結(jié)果提取出來(lái)變成了"abcde"
該語(yǔ)句在class文件中就相當(dāng)于String s = "abcde"
然后當(dāng)JVM執(zhí)行到這一句的時(shí)候, 就在String pool里找
如果沒(méi)有這個(gè)字符串,就會(huì)產(chǎn)生一個(gè)
3、
4、
5、
6、
7、
8、
9、
10、
未完待續(xù)。。。
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的收集Java面试题知识点(Java基础部分三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Notepad++ JSON关键字自动提
- 下一篇: 阿里云E-MapReduce 创建执行计