&運算符有兩種用法:java
&&
運算符是短路與運算。邏輯與跟短路與的差異是很大的,雖然兩者都要求運算符左右兩端的布爾值都是true 整個表達式的值纔是 true。&&
之因此稱爲短路運算是由於,若是&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算。
不少時候咱們可能都須要用 &&
而不是&
,例如在驗證用戶登陸時斷定用戶名不是 null 並且不是空字符串,應當寫爲:username != null &&!username.equals("")
,
兩者的順序不能交換,更不能用&運算符,由於第一個條件若是不成立,根本不能進行字符串的 equals 比較,不然會產生 NullPointerException
異常。函數
注意:邏輯或運算符(|)和短路或運算符(||)的差異也是如此。
== 與equals 的主要區別是:code
若是 == 和 equals() 用於比較對象,當兩個引用地址相同,== 返回 true。而 equals() 能夠返回 true 或者 false 主要取決於重寫實現。最多見的一個例子,字符串的比較,不一樣狀況 == 和 equals() 返回不一樣的結果。對象
注意:equals 方法不能用於基本數據類型的變量,若是沒有對 equals 方法進行重寫,則比較的是引用類型的變量所指向的對象的地址。
方案一:使用標記索引
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("標記後"); }
注:不推薦使用標記,由於它容易破壞代碼的執行順序
hashCode() 的做用是獲取哈希碼,也稱爲散列碼;
它其實是返回一個 int 整數。
這個哈希碼的做用是肯定該對象在哈希表中的索引位置。
hashCode() 定義在 JDK 的 Object.java 中,這就意味着 Java 中的任何類都包含有 hashCode() 函數。
散列表存儲的是鍵值對(key-value),它的特色是:能根據「鍵」快速的檢索出對應的「值」。這其中就利用到了散列碼。(能夠快速找到所須要的對象)io
這裏以「HashSet 如何檢查重複」 爲例子來講明爲何要有 hashCode :
當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其餘已經加入的對象的 hashcode 值做比較,若是沒有相符的 hashcode,HashSet 會假設對象沒有重複出現。可是若是發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。
若是二者相同,HashSet 就不會讓其加入操做成功。
若是不一樣的話,就會從新散列到其餘位置。
這樣咱們就大大減小了 equals 的次數,相應就大大提升了執行速度。class
hashCode()與 equals()的相關規定:登錄
等於-1
在數軸上取值時,中間值(0.5)向右取整: