本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫
開篇介紹
大家好,我是Java面試題庫的提褲姐,今天這篇是JavaSE系列的第三篇,主要總結了JavaSE語法中會出現的相關面試題,在後續,會沿著第一篇開篇的知識線路一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養成一個好習慣。
Q:
& 和 && 的區別?
&運算符有兩種用法:
按位與邏輯與&&運算符是短路與運算。邏輯與跟短路與的差別是很大的,雖然二者都要求運算符左右兩端的布爾值都是true 整個表達式的值才是 true。
&&之所以稱為短路運算是因為,如果&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算。
很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是 null
且不是空字符串,應當寫為:
username != null &&!username.equals("")
,二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進行字符串的 equals 比較,否則會產生
NullPointerException
異常。
注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。
Q:
== 和 equals 的區別?
==與 equals 的主要區別是:
equals 和== 最大的區別是一個是方法,一個是運算符== 常用於比較原生類型,而 equals() 用來比較方法兩個對象的內容是否相等。== 如果比較的對象是基本數據類型,則比較的是數值是否相等;如果比較的是引用數據類型,則比較的是對象的地址值是否相等。如果 == 和 equals() 用於比較對象,當兩個引用地址相同,== 返回 true。而 equals() 可以返回 true 或者 false 主要取決於重寫實現。最常見的一個例子,字符串的比較,不同情況 == 和 equals() 返回不同的結果。
注意:equals 方法不能用於基本數據類型的變量,如果沒有對 equals 方法進行重寫,則比較的是引用類型的變量所指向的對象的地址。
Q:
在 Java 中,如何跳出當前的多重嵌套循環?
方案一:使用標記
1 public static void main(String[] args) {2 System.out.println("標記前"); 3 ok: 4 for (int i = 0; i < 10; i++) { 5 for (int j = 0; j < 10; j++) { 6 System.out.println("i=" + i + ",j=" + j); 7 if (j == 5) { 8 break ok; 9 }10 }11 }12 System.out.println("標記後");13 }
運行結果:
1標記前2i=0,j=03i=0,j=14i=0,j=25i=0,j=36i=0,j=47i=0,j=58標記後
方案二:使外層的循環條件表達式的結果可以受到裡層循環體代碼的控制
1 public static void main(String[] args) {2 System.out.println("標記前"); 3 boolean flag = true; 4 for (int i = 0; i < 10; i++) { 5 for (int j = 0; j < 10 && flag; j++) { 6 System.out.println("i=" + i + ",j=" + j); 7 if (j == 5) 8 flag = false; 9 }10 }11 System.out.println("標記後");12 }
註:不推薦使用標記,因為它容易破壞代碼的執行順序
Q:
為什麼重寫 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 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)
Q:
Java中的Math.round(1.5)等於多少?
等於-1在數軸上取值時,中間值(0.5)向右取整:
+0.5是往上取整-0.5直接捨棄