Java面試題記錄第二天

段桑進化論 發表於 2020-10-16

Java面試題記錄第二天

1.簡單的Hello World輸出!
-------------------------------------要注意靜態程式碼塊!-----------------------------------------

package JavaTest;
public class Hello {
    static {
        System.out.println("看這裡,我是靜態程式碼塊,我要先執行,JVM載入類," +
                "就會執行我,但是就執行一次,無論我在main方法的前或者後");
    }
    public static void main(String[] args) {
        System.out.println("Hello World!!!");
    }
}
結果為:
看這裡,我是靜態程式碼塊,我要先執行,JVM載入類,就會執行我,但是就執行一次,無論我在main方法的前或者後
Hello World!!!

2.++i與i++ 的區別?
答:不同點:在於i++是先進行參與運算,在開始自增,也就是說此時的i等於原來的值;而++i的話,意味著,先進行自增,在進行參與運算。
首先看題,這裡這個題有些問題,沒有規定資料型別,預設為int型

假設x=1,y=2,z=3,則表示式y+=z--/++x的值是多少?
y+=也就意味著y=y+表示式
z--:先參與運算,在自減,此時z--的值為3++x:先自增,再參與運算,此時++x的值為2.
由於--++的優先順序高於/,所以y+=3/2),注意此時的型別預設是int型,1.5=1,所以結果才為3

3."=="與equals與hashCode有什麼區別?
答:

  1. "=="運算子用來比較兩個變數的值首否相等。也就是說,該運算子用於比較變數對應的記憶體中所儲存的數值是否相同,這個時候就表明和記憶體沒有什麼關係,只是和記憶體中儲存的數值有關係。如果說這兩個比較的變數是基本資料型別,那麼可以直接使用運算子來進行比較,但是當涉及到變數是物件的話,此時就包含到了記憶體,例如:string str=new string(),變數str佔用一塊儲存空間,而new string()則儲存了另一個儲存空間,,此時的str儲存的是【new string()裡內容的】地址,也就是說,str是儲存的是一個地址。
public class Test2 {
    public static void main(String[] args) {
        String str1=new String("Apple");
        String str2=new String("Apple");
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));
    }
}
結果是:
false
true

由此可以看到:str1與str2的結果不是相等的,因為str1與str2儲存的地址不一樣。我們可以看到使用equals方法結果不一樣。
2. equals是object類提供的方法之一。每個Java物件都會繼承自object類,所以每個物件都具有該方法。當比較的變數是基本資料型別,此時equals與"=="結果是一樣的,equals方法的特殊之處就是在於它可以被覆蓋(也就是說equals方法重寫),所以可以通過覆蓋的方法讓他不是比較引用,而是比較資料的內容。重寫equals方法也會導致重寫hashCode()方法。
3.hashCode()方法是從object類中繼承過來的,也是用來判斷兩個物件是否相等。hashCode()方法是返回物件在記憶體中地址轉換成的一個int值,結合equals方法,str1.equals(str2)返回值是true,那麼hashCode()方法返回的int值一定相等,反之,str1.equals(str2)返回值是false,那麼那麼hashCode()方法返回的int值不相等。(自己總結來說,equlas方法是巨集觀的,而hashcode方法更多的是底層的)
4.為什麼重寫equals方法也要同時重寫hashcode方法?
答:首先是會違反hashcode的通用約定。使用hashcode方法提前校驗,可以避免每一次比對都呼叫equals方法,提高效率;保證是同一個物件,如果重寫了equals方法,而沒有重寫hashcode方法,會出現equals相等的物件,hashcode不相等的情況(存在hash衝突),重寫hashcode方法就是為了避免這種情況的出現。