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

1、& 和 && 的區別?

&運算符有兩種用法:java

  • 按位與
  • 邏輯與

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

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

2、== 和 equals 的區別?

== 與equals 的主要區別是:code

  • equals 和== 最大的區別是一個是方法,一個是運算符
  • == 經常使用於比較原生類型,而 equals() 用來比較方法兩個對象的內容是否相等。
  • == 若是比較的對象是基本數據類型,則比較的是數值是否相等;若是比較的是引用數據類型,則比較的是對象的地址值是否相等。

若是 == 和 equals() 用於比較對象,當兩個引用地址相同,== 返回 true。而 equals() 能夠返回 true 或者 false 主要取決於重寫實現。最多見的一個例子,字符串的比較,不一樣狀況 == 和 equals() 返回不一樣的結果。對象

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

3、在 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
標記後

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

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("標記後");
    }
注:不推薦使用標記,由於它容易破壞代碼的執行順序

4、爲何重寫 equals時必須重寫 hashCode 方法?

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

5、爲何要有 hashCode?

這裏以「HashSet 如何檢查重複」 爲例子來講明爲何要有 hashCode :
當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其餘已經加入的對象的 hashcode 值做比較,若是沒有相符的 hashcode,HashSet 會假設對象沒有重複出現。可是若是發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。
若是二者相同,HashSet 就不會讓其加入操做成功。
若是不一樣的話,就會從新散列到其餘位置。
這樣咱們就大大減小了 equals 的次數,相應就大大提升了執行速度。class

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

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

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

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

  • +0.5是往上取整
  • -0.5直接捨棄
相關文章
相關標籤/搜索