Map

Map用于保存有映射关系的数据,因此Map集合里保存着两组值,一组用于保存Map里的key,另一组保存value,key不允许重复,key和value一对一

Map里的所有key可以组成一个Set集合(无序且不重复),keySet()方法返回Map的key组成的Set集合。

Map的key存储形式也和Set惊人的一致:

  Set接口下有HashSet,LinkedHashSet,SortedSet(接口),TreeSet,EnumSet等子接口和实现类

  Map接口下有HashMap,LinkedHashMap,SortedMap(接口),TreeMap,EnumMap等子接口和实现类

  Map子接口和实现类中key集的存储形式和对应Set子接口和实现类元素的存储形式完全一致

源码上看,对于Set,java是先实现一个Map,然后通过包装一个所有value为null的Map实现Set集合

Map转List来实现自定义排序:

  List<Map.Entry<K,V>> list = new ArrayList<>(map.entrySet());

  Collections.sort(list,new Comparator<Map.Entry<K,V>>(){public int compare(Entry<K,V> e1, Entry<K,V> e2){return e1.getValue() - e2.getValue();}}

Map接口常用方法:

  void clear():删除该Map所有key-value对

  boolean containsKey(key):查询是否包含指定key,包含则返回true

  boolean containsValue(value):插叙是否包含一个或多个指定value,包含返回true

  Set entrySet():返回Map包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类,用来封装key-value,存储时只考虑key)

    通过for(Map.Entry e : map.entrySet(){e.getKey();e.getValue()}获得key和value

  Object get(key):返回key对应的value,不包含该key则返回null

  boolean isEmpty():查询Map是否为空,空返回true

  Set keySet():返回Map所有key组成的Set集合

  Object put(key,value):添加一个key-value对,如果已有,则覆盖原来value的并返回被覆盖的value

  void putAll(Map m):复制m到Map中

  Object remove(key):删除key对应的k-v对,返回被删除的key关联的value,key不存在则返回null

  boolean remove(key,value):删除指定k-v对,成功则返回true

  int size():返回k-v对个数

  Collection values():返回Map里所有value组成的Collection

  Object replace(key,value):替换指定key的value,与put不同的是不会添加新的k-v对,如果key不存在则返回null

java8改进的HashMap和Hashtable实现类:

  HashMap和Hashtable是Map接口的两个经典实现类,关系类似于ArrayList和Vector,Hashtable是古老的,从java1.0就出现的Map实现类,包含两个繁琐的方法:

  elements():类似于Map的values()

  keys():类似于Map的keySet()

  区别:

    Hashtable是线程安全,但性能低,适用于多线程,HashMap线程不安全

    Hashtable不允许使用null作为key和value,否则引发NullPointException,但HashMap允许使用null作key或者value(key只能有一个null,value可以有无数个null)

  避免使用Hashtable,可以使用Collections工具类把HashMap变成线程安全的

  key必须实现了hashCode和euqals方法,value必须实现equals方法

  key尽量不要使用可变对象,必须使用则尽量不要修改可变对象

LinkedHashMap类:

  LinkedHashMap使用双向链表维护k-v对的次序,迭代顺序与插入顺序一致,性能低于HashMap,迭代性能高于HashMap

Properties类:

  Properties类是Hashtable类的子类,用来处理属性文件,相当于一个key,value都是String的Map,把Map和属性文件关联起来,从而可以从Map写入属性文件或者把属性文件的值加载到Map

Sorted接口和TreeMap实现类:

  如同Set接口派生出SortedSet子接口,SortedSet子接口有一个TreeSet实现类一样,Map接口也派生出SortedMap子接口,SortedMap子接口有一个TreeMap实现类

  TreeMap是一个红黑树数据结构,每个k-v是红黑树一个节点,TreeMap存储k-v时,需要根据key对节点进行排序,保证所有k-v处于有序状态,有两种排序方式:

    自然排序:所有key必须实现Comparable接口,且是同一个类的对象

    定制排序:创建时传入一个Comparator对象,不要求key实现Comparable接口

  TreeMap比Hashtable还慢,但有序

WeakHashMap实现类:

  用法与HashMap基本相似,区别在于,HashMap保留了对实际对象的强引用,意味着只要该HashMap对象不销毁,该HashMap所有key引用的对象就不会被垃圾回收,HashMap也不会自动删除这些key对象的k-v对

  但WeakHashMap只保留了对实际对象的弱引用,意味着WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则可能被垃圾回收,WeakHashMap也可能自动删除这些k-v对,当key对象被回收时

IdentityHashMap实现类:

  实现机制与HashMap基本相似,但他在处理两个key相等时比较独特:在IdentityHashMap中,当两个key严格相等(key1==key2),IdentityHashMap才认为两个key相等。也允许使用null作为key和value,不保证k-v顺序

EnumMap实现类:

  EnumMap是一个与枚举类一起使用的Map,EnumMap所有key必须是单个枚举类的枚举值,创建EnumMap对象时必须显示或者隐式的指定他对应的枚举类,有如下特征:

    内部以数组形式保存,非常紧凑,高效

    根据key的自然顺序(枚举值在枚举类中定义顺序)来维护k-v顺序

    不允许使用null作为key,允许作为value

原文地址:https://www.cnblogs.com/zawjdbb/p/7028022.html