1 String s1="abc"; 2 String s2="abc"; 3 System.out.println(s1==s2); 4 System.out.println(s1.equals(s2)); 5 /*output: 6 true 7 true 8 */
本題主要考察對於java常量池的理解。java中的常量池技術,是爲了方便快捷地建立某些對象而出現的,當須要一個對象時,就能夠從池中取一個出來(若是池中沒有則建立一個),則在須要重複建立相等變量時節省了不少時間。常量池其實也就是一個內存空間,常量池存在於方法區中。根據代碼順序,先在常量池中建立」abc「,並指向s1,然後在建立s2時,因爲常量池中已經存在」abc「,只需指向s2就能夠,而不須要再建立。」==」在這裏比較的是對象引用,故結果爲」true」,String 中的equals方法通過重寫後操做爲「比較此字符串與指定的對象。當且僅當該參數不爲 null,而且是表示與此對象相同的字符序列的 String 對象時,結果才爲 true」。很明顯,s1和s2的字符序列相同,故而結果爲true。
(2)「 String s1=new String(「abc」)」語句建立了幾個對象?
該語句首先String s1是聲明,new String(「abc」)先在常量池中查找,若沒有則建立「abc」,然後經過new在堆內存中建立對象,把「abc」拷貝賦值。String 定義爲初始化一個新建立的 String 對象,表示一個與該參數相同的字符序列;換句話說,新建立的字符串是該參數字符串的一個副本。故建立常量池和堆內存中兩個對象,兩個對象的地址值不同。
(3)java
1 String s1=new String("abc"); 2 String s2="abc"; 3 System.out.println(s1==s2); 4 System.out.println(s1.equals(s2)); 5 /*output: 6 false 7 true 8 */
由(2)分析可知s1在堆內存中,s2在常量池中,故結果爲false,true
(4)app
1 String s1="a"+"b"+"c"; 2 String s2="abc"; 3 System.out.println(s1==s2); 4 System.out.println(s1.equals(s2)); 5 /*output: 6 true 7 true 8 */
本題主要考察java中常量優化機制,編譯時s1已經成爲「abc」在常量池中查找建立,s2不須要再建立。
(5)優化
1 String s1="ab"; 2 String s2="abc"; 3 String s3=s1+"c"; 4 System.out.println(s3==s2); 5 System.out.println(s3.equals(s2)); 6 /*output: 7 false 8 true 9 */
Java 語言提供對字符串串聯符號(」+」)和其餘對象到字符串的轉換的特殊支持。字符串串聯是經過 StringBuilder(或 StringBuffer)類及其 append 方法實現的,字符串轉換是經過 toString 方法實現的。在本題中,先在常量池中建立」ab「,地址指向s1,再建立」abc」,指向s2。對於s3,先建立StringBuilder(或 StringBuffer)對象,經過append鏈接獲得「abc」,再調用toString()轉換獲得的地址指向s3。故(s3==s2)爲false.ui