Map与AbstractMap

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> entrySet();

下面是Java集合的继承关系,可以看出Map实现类主要有:

  • Hashtable
    古老,线程安全
  • HashMap
    速度很快,但没有顺序
  • TreeMap
    有序的,效率比 HashMap 低
  • LinkedHashMap
    结合 HashMap 和 TreeMap 的有点,有序的同时效率也不错,仅比 HashMap 慢一点


    Map与AbstractMap_第1张图片
    Map

AbstractMap

AbstractMap 提供了 Map 的基本实现。
AbstarctMap 中唯一的抽象方法:

public abstract Set> entrySet();

和AbstractCollection,AbstractList 作用相似, AbstractMap 是一个基础实现类,实现了 Map 的主要方法,默认不支持修改。
正如Map 接口中有内部类 Map.Entry 一样, AbstractMap 也有两个内部类:

  • SimpleImmutableEntry, 表示一个不可变的键值对
  • SimpleEntry, 表示可变的键值对

SimpleEntry 与 SimpleImmutableEntry 唯一的区别就是支持 setValue() 操作。

你可能感兴趣的:(集合)