1. 程式人生 > >2018秋季社招愛奇藝java實習生面試題

2018秋季社招愛奇藝java實習生面試題

  • 題目:

    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的地址值不相同,導致= =的結果不同。