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