Java - 容器
本章學習,記住: 1 1 3 6(一張圖、一個類、三個知識點、六個接口)
主要內容:
容器的概念:
容器 API:
Collection 接口:
重寫 equals 方法,你應該也重寫 hashCode 方法,這是為了程序執行效率著想!!!
補充說明:
Java中equals()和hashCode()有一個契約:
1. 如果兩個對象相等的話,它們的hash code必須相等; (當對象被用做索引時,在比較其是否相等時,就會優先判斷hashCode(),如果hashCode()都不相等,就不會去調用equals(),相當於:( A.hashCode()==B.hashCode() ) && ( A.equals(B) ),有短路效果!!!
2. 但如果兩個對象的hash code相等的話,這兩個對象不一定相等。
1、自定義一個 hashCode() 方法是一個比較麻煩的事,與其不如用現成的,上圖中實現 hashCode 方法就是用的 String 類已經實現了的,具體怎麽實現我不去管它,Sun 公司已經幫我寫好了。
2、有人又問了,Que:不是已經有 equals 方法了嗎?為什麽還要重寫 hashCode 方法呢?Ans:若 equals 中比較的條件比較多或者比較的算法比較繁瑣,這時用 equals 一個一個的比較,效率會很低,若先直接拿它 hashCode來作比較會增加比較的速度(附述一點:sun規定相等的對象應該具有相等的hash codes,這是前提,如上圖紅色標記!所以說如果hashCode都不相等就沒有比較equals的必要了)。
3、有人又問了,Que:在什麽時候使用這個hashCode 方法呢?Ans:當這個類的某個對象被當做索引(也就是key)的時候,一旦涉及到元素比較,Java運行時系統會優先調用hashCode方法進行比較,只有在hashCode相等的情況下,再去調用equlas方法進行比較,所以這樣做效率大大的提升。
4、上圖例子中重寫java.lang.Object類的hashCode方法後,是用的Name類的firstName成員變量的hashCode作為hashCode返回(也就說我現在規定Name 類所new出來的實例對象之間判斷是否相等的先決條件為:它們的firstName的hashCode一樣),也可以規定多個(如果你想要把firstName和lastName的hashCode都一樣視為相等的先決條件,這時返回值可以采用return firstName.hashCode() + lastName.hashCode();多個依此類推,把它們的hashCode全部相加,一並返回)。
5、所以有這樣的總結:當類的對象做為索引時,需要比較類的兩個實例是否一樣:調用hashCode方法的優先級要比調用equlas方法高,編程時,hashCode相等一般為先決條件(先決條件:這裏就要考慮返回哪些成員變量的hashCode之和了),只有在先決條件滿足的情況下Java運行時系統才會調用equals方法,所以說equals的比較條件應該比hashCode的比較條件更為嚴格(至少要hashCode一樣)。
Iterator 接口:
補充說明:這裏的copy方法是將src容器中的元素下標0開始替換到dest容器中(dest容器中相應下標的位置的元素會被覆蓋),而不是附加在dest之後;所有必須dest.size() > src.size(),否則拋出IndexOutOfBoundsException例外
map的key如果是字符型,識別大小寫
Map 示例程序:統計不同的單詞,並記錄相同單詞出現的次數
Java - 容器