HashMap通過計算Key的hashCode(),直接定位到Value在內部數組的索引,所以效率很高。
Key是枚舉類型的Map:EnumMap
如果Key是enum類型,那么就可以使用Java集合庫提供的一種EnumMap,它在內部以一種緊湊的數組存儲Value,並且根據enum類型的Key直接定位到內部數組索引,且不需要計算hashCode(),效率高且沒有空間浪費。
例子
假設有一個枚舉類DayOfWeek:
enum DayOfWeek { SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY; }
利用這個枚舉類實現一個EnumMap:
import java.util.*; public class Main { public static void main(String[] args) { Map <DayOfWeek,String> map = new EnumMap<> (DayOfWeek.class); map.put(DayOfWeek.MONDAY, "星期一"); map.put(DayOfWeek.TUESDAY, "星期二"); map.put(DayOfWeek.WEDNESDAY, "星期三"); map.put(DayOfWeek.THURSDAY, "星期四"); map.put(DayOfWeek.FRIDAY, "星期五"); map.put(DayOfWeek.SATURDAY, "星期六"); map.put(DayOfWeek.SUNDAY, "星期日"); System.out.println(map); System.out.println(map.get(DayOfWeek.MONDAY)); } } {SUNDAY=星期日, MONDAY=星期一, TUESDAY=星期二, WEDNESDAY=星期三, THURSDAY=星期四, FRIDAY=星期五, SATURDAY=星期六} 星期一
使用EnumMap時,我們總是用Map接口來引用它(正如上文代碼中標紅的部分)。因此,實際上可以把HashMap與EnumMap互換(指的是對EnumMap調用HashMap的方法),在客戶端看來沒有任何區別。
小結
如果Map的Key是enum類型,推薦使用EnumMap,既保證速度又不浪費控件。
使用EnumMap時,根據面向抽象編程原則,應使用Map接口。