【003期】JavaSE面試題(三):JavaSE語法(1)

一、& 和 && 的區別?

&運算符有兩種用法:

  • 按位與
  • 邏輯與

&&運算符是短路與運算。邏輯與跟短路與的差別是很大的,雖然二者都要求運算符左右兩端的布爾值都是true 整個表達式的值纔是 true。
&&之所以稱爲短路運算是因爲,如果&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算。
很多時候我們可能都需要用 &&而不是&,例如在驗證用戶登錄時判定用戶名不是 null 而且不是空字符串,應當寫爲:
username != null &&!username.equals("")
二者的順序不能交換,更不能用&運算符,因爲第一個條件如果不成立,根本不能進行字符串的 equals 比較,否則會產生 NullPointerException 異常。

注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。

二、== 和 equals 的區別?

== 與equals 的主要區別是:

  • equals 和== 最大的區別是一個是方法,一個是運算符
  • == 常用於比較原生類型,而 equals() 用來比較方法兩個對象的內容是否相等。
  • == 如果比較的對象是基本數據類型,則比較的是數值是否相等;如果比較的是引用數據類型,則比較的是對象的地址值是否相等。
    如果 == 和 equals() 用於比較對象,當兩個引用地址相同,== 返回 true。而 equals() 可以返回 true 或者 false 主要取決於重寫實現。最常見的一個例子,字符串的比較,不同情況 == 和 equals() 返回不同的結果。

注意:equals 方法不能用於基本數據類型的變量,如果沒有對 equals 方法進行重寫,則比較的是引用類型的變量所指向的對象的地址。

三、在 Java 中,如何跳出當前的多重嵌套循環?

方案一:使用標記

    public static void main(String[] args) {
        System.out.println("標記前");
        ok:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println("i=" + i + ",j=" + j);
                if (j == 5) {
                    break ok;
                }
            }
        }
        System.out.println("標記後");
    }

運行結果:

標記前
i=0,j=0
i=0,j=1
i=0,j=2
i=0,j=3
i=0,j=4
i=0,j=5
標記後

方案二:使外層的循環條件表達式的結果可以受到裏層循環體代碼的控制

    public static void main(String[] args) {
        System.out.println("標記前");
        boolean flag = true;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10 && flag; j++) {
                System.out.println("i=" + i + ",j=" + j);
                if (j == 5)
                    flag = false;
            }
        }
        System.out.println("標記後");
    }

注:不推薦使用標記,因爲它容易破壞代碼的執行順序

四、爲什麼重寫 equals時必須重寫 hashCode 方法?

hashCode() 的作用是獲取哈希碼,也稱爲散列碼;
它實際上是返回一個 int 整數。
這個哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode() 定義在 JDK 的 Object.java 中,這就意味着 Java 中的任何類都包含有 hashCode() 函數。
散列表存儲的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼。(可以快速找到所需要的對象)

五、爲什麼要有 hashCode?

這裏以“HashSet 如何檢查重複” 爲例子來說明爲什麼要有 hashCode :
當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode 值作比較,如果沒有相符的 hashcode,HashSet 會假設對象沒有重複出現。但是如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。
如果兩者相同,HashSet 就不會讓其加入操作成功。
如果不同的話,就會重新散列到其他位置。
這樣我們就大大減少了 equals 的次數,相應就大大提高了執行速度。

hashCode()與 equals()的相關規定:

  • 如果兩個對象相等,則 hashcode 一定也是相同的
  • 兩個對象相等,對兩個對象分別調用 equals 方法都返回 true
  • 兩個對象有相同的 hashcode 值,它們也不一定是相等的
  • 因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋
  • hashCode() 的默認行爲是對堆上的對象產生獨特值。如果沒有重寫- hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)

六、Java中的Math.round(1.5)等於多少?

等於-1
在數軸上取值時,中間值(0.5)向右取整:

  • +0.5是往上取整
  • -0.5直接捨棄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章