map是什么?键值对,key-value映射就是map。我们从三个角度分析:keyset,values,Entry。
keyset
keyset是键key的Set集合,可以看出对于键map是不允许重复的,所以需要重写equals,hashCode方法,来保证正确的相等性比较。通过Map.keySet() 获取。
values
values是值Value的Collection集合,可以看出这里键与值的要求不同,通过 Map.values() 方法获得。
entrySet
Entry 是 Map 接口中的静态内部接口,表示一个键值对的映射。内部的一些方法:
- getKey() , 获取这组映射中的键 key
- getValue() , 获取这组映射中的值 value
- setValue() , 修改这组映射中的值
- hashCode() , 返回这个 Entry 的哈希值
- equals() , 对比 key-value 是否相等
通过 Map.entrySet() 方法获得的是一组 Entry 的集合,保存在 Set 中,所以 Map 中的 Entry 也不能重复。
public Set<Map.Entry<K,V>> entrySet();
下面是Java集合的继承关系,可以看出Map实现类主要有:
- Hashtable
古老,线程安全 - HashMap
速度很快,但没有顺序 - TreeMap
有序的,效率比 HashMap 低 -
LinkedHashMap
结合 HashMap 和 TreeMap 的有点,有序的同时效率也不错,仅比 HashMap 慢一点
AbstractMap
AbstractMap 提供了 Map 的基本实现。
AbstarctMap 中唯一的抽象方法:
public abstract Set<Entry<K,V>> entrySet();
和AbstractCollection,AbstractList 作用相似, AbstractMap 是一个基础实现类,实现了 Map 的主要方法,默认不支持修改。
正如Map 接口中有内部类 Map.Entry 一样, AbstractMap 也有两个内部类:
- SimpleImmutableEntry, 表示一个不可变的键值对
- SimpleEntry, 表示可变的键值对
SimpleEntry 与 SimpleImmutableEntry 唯一的区别就是支持 setValue() 操作。