你的位置:首页 > Java教程

[Java教程]java集合 之 Map集合


Map用于保存具有映射关系的数据,具有两组值:一组用于保存Map中的key;另一组用于保存Map中的value,形成key-value的存储形式

Map集合中包含的一些方法:

void clear():删除Map集合中的所有key-value对。

boolean containsKey(object key):查询Map集合中是否包含指定的key,如果包含,返回true。

boolean containsValue(Object value): 查询Map集合中是否包含指定的value,如果包含返回true。

set entrySet():返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。

Object get(Object key):返回指定的key所对应的value;如果此Map中不包括该key,则返回null。

boolean isEmpty():查询该Map是否为空,如果为空则返回null。

set keyset():返回该map中所有key所组成的集合。

Object put(Object key,Object value):添加一个key-value对,如果当前Map中已有一个与该key相等的key-value对,则新的key-value会覆盖原来的key-value对。

void putAll(Map m):将指定Map中key-value复制到当前Map中。

Object remove(Object key):删除指定key所对应的key-value对,返回被删除key所对应的value,如果key不存在返回null。

boolean remove(Object key, Object value):删除指定key,value所对应的key-value对。如果成功删除,则返回true,否则返回false。

int size():返回该Map中key-value的个数。

Collection values():返回该Map中所有value组成的collection。

Java8为Map新增的方法:

Object compute(Object key, BiFunction remappingFunction):该方法使用remappingFunction根据原key-value对计算一个新的value。只要新的value不为null,就使用新的value覆盖原value;如果原value为null,但新value不为null,则删除原key-value对;如果原value、新value同时为null,那么该方法不改变任何key-value对,直接返回null。

Object computeIfAbsent(Object key, Function mappingFunction):如果传入的key参数在Map中对应的value为null,该方法将使用mappingFunction根据原key、value计算一个新的结果,如果该计算结果不为null,则用该计算结果覆盖原value;如果原Map原来不包括该key,该方法可能会添加一组key-value对。

Object computeIfPresent(Object key, BiFunction remappingFunction):如果传给该方法的key参数在Map中对应的value不为null,该方法将使用remappingFunction根据原key、value计算一个新结果,如果该计算结果不为null,则使用该结果覆盖原来的value;如果计算结果为null,则删除原key-value对。
void forEach(BiConsumer action):该方法是Java8为Map新增的一个遍历key-value对的方法。

Object getOrDefault(Object key, V defaultValue):获取指定的key对应的value。如果该key不存在,则返回defaultValue。

Object merge(Object key, Object value, BiFunction remappingFunction):该方法会先根据key参数获取该Map中对应的value。如果获取的value为null,则直接使用传入的value覆盖原value(在这种情况下,可能会添加一组key-value);如果获取的value不为null,则使用remappingFunction函数根据原value、新value计算一个新的结果,并用新的结果去覆盖原有的value。

Object putIfAbsent(Object key, Object value):该方法会自动检测指定的key对应的value是否为null,如果该key对应的value为null,则使用传入的新value代替原来的null。

Object replace(Object key, Object value):将Map中指定key对应的value替换成新value。如果key在Map中不存在,该方法不会添加key-value对,而是返回null。

Boolean replace(K key, V oldValue, V newValue):将Map中指定的key-value对的原value替换成新value。如果在Map中找到指定的key-value对,则执行替换并返回true,否则返回false。

replaceAll(BiFunction function):该方法使用function对原key-value对执行计算,并将计算结果作为key-value对的value值。

Java8改进的HashMap和Hashtable实现类

HashMap和Hashtable是Map接口的典型实现类。HashMap和Hashtable存在两点典型区别:

1、   Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能更高一些;但如果有多个线程访问同一个Map对象时,使用Hashtable会更好。

2、   Hashtable不允许使用null作为key和value,如果试图将null值放进Hashtable中,将会引发NullPointerException异常,但HashMap可以使用null作为key或value。

PS:

A、   由于HashMap中的key不能重复,所以HashMap中只能最多有一个key-value对的key为null,但可以有无数多个key-value对的value为null。

B、   Hashtable是一个古老的类,他的名字甚至没有遵守java命名规范。与Vector类似,尽量少用Hashtable实现类,即使是需要创建线程安全的Map实现类,也无需使用Hashtable实现类。

C、   HashMap和Hashtable判断两个key值相等的的标准是:两个key通过equals()方法比较返回true,两个key的Hashcode值也相等。

LinkHashMap实现类

LinkHashMap是使用双向链表来维护key-value对的次序(其实只考虑了key的次序),该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序一致。

使用Properties读写属性文件

Properties是Hashtable的子类,该对象在处理属性文件时十分方便。Prooperties类将Map对象和属性文件关联起来,从而可以将Map对象中的key-value对写入属性文件中,也可以将属性文件中的“属性名=属性值”加载到Map对象中。由于属性文件中的属性名和属性值都是字符串类型,所以Properties里的key、value都是字符串类型的。

该类提供了如下三个方法来修改Properties中的key、value值:

String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map中的get(Object key)方法。

String getProperty(String key, String defaultValue): 获取Properties中指定属性名对应的属性值,如果Properties中不存在指定的key时,则该方法指定默认值。

Object setProperty(String key, String value):设置属性值。

它还提供了两个读写属性文件的方法:

Void load(InputStream instream):从属性文件中加载key-value对,将加载到的key-value对追加到Properties中(Properties是Hashtable的子类,他不保证key-value对之间的次序)。

Void store(OutputStream out, String comments):将Properties中的Key-value对输出到指定的属性文件中。

SortedMap接口和TreeMap实现类

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

TreeMap就是一个红黑树数据结构,每个key-value对作为红黑树的一个节点。TreeMap在存储key-value对(节点),需要根据key对节点进行排序。TreeMap保证所有的key-value对处于有序状态。TreeMap有两种排序方式:

自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key必须是同一个类的对象,否则会抛出ClassCastException异常。

定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的key进行排序。采用定制排序不要求TreeMap中的key实现Comparator接口。

TreeMap提供了一系列根据key顺序访问key-value对的方法。

Map.Entry firstEntry():返回该Map中最小key对应的key-value对;如果该Map为空,则返回null。

Object firstKey():返回该Map中最小的key值;如果该Map为空,则返回null。

Map.Entry lastEntry():返回该Map中最大的key所对应的key-value对;如果该Map为空或不存在这样的key,则都返回null。

Object lastKey():返回该Map中最大的key;如果该Map为空或不存在这样的key,则返回null。

Map.Entry higherEntry(Object key):返回该Map中大于指定key的后一位key-value对(大于key的最小key)。如果该Map为空,则返回null。

Object higherKey(Object key):返回该Map中大于指定key的最小key;如果该Map为空,则返回null。

Map.Entry lowerEntry(Object key):返回该Map中位于指定key前一位的key-value对(即小于指定key的最大key对应的key-value对);如果该Map为空或不存在这样的key-value对,则返回null。

Object lowerKey(Object key):返回该Map中位于指定key前一位key(小于指定key的最大key)。如果该Map为空或不存在这样的key,则返回null。

NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey,  boolean toInclusive):返回该Map的子Map,其key范围是从fromKey(是否包括有传入的第二个参数决定)到toKey(是否包括由第四个参数决定)。

SortedMap subMap(Object fromKey, Object toKey):返回该Map的子Map,其key值得范围是由fromKey(包括)到toKey(不包括)。

SortedMap tailMap(Object fromKey):返回该Map的子Map,其范围是大于fromKey(包括)的所有key。

NavigableMap tailMap(Object fromKey, boolean inclusive):返回该Map的子Map,其key值的范围是大于fromKey(是否包括取决于第二个参数)的所有key。

SortedMap headMap(Object tokey):返回该Map的子Map,其key的范围是小于tokey(不包括)的所有key。

NavigableMap heapMap(Object tokey, boolean inclusive):返回该Map的子Map,其key的范围是小于tokey(是否包括取决于第二个参数)的所有key。

WeakHashMap实现类

     WeakHashMap与HashMap的用法基本相似。与HashMap的区别在于,HashMap的值保留了对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap中的所有key所引用的对象就不会被垃圾回收,hashMap也不会主动删除这些key-value对;但WeakHashMap只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

IdentityHashMap实现类

这个Map实现类的实现机制与HashMap基本类似,但它在处理两个key值相等时比较独特:在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为这两个key相等;对于普通的HashMap而言,只要key1和key2通过equals()方法比较返回true,且它们的hashCode值相等即可。

EnumMap实现类

EnumMap是一个和枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式的指定它对应的枚举类。EnumMap具有以下特征:

1.EnumMap在内部以数组的形式保存,所以这种实现形式十分紧凑高效。

2.EnumMap根据key的自然顺序(即枚举值在枚举类中定义顺序)来维护key-value对的顺序。当程序通过keySet()、entrySet()、values()等方法便利EnumMap是可以看到这些顺序。

3.EnumMap不允许使用null来做为key,但允许null作为value。如果试图使用null来做为key,程序将抛出NullPointerException异常。

4.创建EnumMap时必须指定一个枚举类,从而将该EnumMap和指定枚举类关联起来。