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