2018秋季社招愛奇藝java實習生面試題
阿新 • • 發佈:2018-12-22
-
題目:
String a = new String("abc"); String b = new String("abc"); System.out.println(a.equals(b)); System.out.println(a== b); String a1 = "abc"; String b1 = "abc"; System.out.println(a1.equals(b1)); System.out.println(a1== b1);
這兩種建立方式輸出分別是什麼?為什麼?請解釋並分析
String a = new String("abc"); String b = new String("abc"); System.out.println(a.equals(b));//equals的底層實現其實也是使用“= =”完成的但是equals是可以重寫的方法,也就是 如果比較兩個類物件是否相同我們不重寫equals的話它就相當於是= =但是經過我們的重寫可以定義成為比較兩個物件的內部值,而這也是 它與= = 的不同 System.out.println(a== b);
現在讓我們來看這個列印的結果:
true
false
很顯然我們直接使用的已經被String重寫過的equals所以equals比較的就是內部值,而==則是比較所分配的空間地址,但是讓我們接著看:
String a1 = "abc";
String b1 = "abc";
System.out.println(a1.equals(b1));
System.out.println(a1== b1);
而此時的結果是:
true
true
原因則是JVM虛擬機器記憶體中的常量池,常量池屬於方法區的一部分,當執行到a1建立物件時,如果常量池中沒有,就在常量池中建立一個物件”abc”,第二次建立的時候,虛擬機發現這個值已經在常量池中建立所以就直接使用,所以兩次建立的物件的地址值相同,所以==的結果也為true。但是第一次的a,b則不同,因為這裡建立了兩次物件,首先是在常量池中建立了物件”abc”,接著是在堆記憶體中建立了物件a,所以a和b的地址值不相同,導致= =的結果不同。