美文网首页Java集合
12 Java集合 - Map集合

12 Java集合 - Map集合

作者: 王毅巽 | 来源:发表于2018-02-21 21:26 被阅读52次

    12.1 Map集合

            Map集合用于保存具有映射关系的数据,key和value都可以是任意类型的数据,key不允许重复。Map中包括一个内部类Entry,该类封装了一个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对象。

            - Object get(Object key):返回指定key所对应的value,如果不包含该key则返回null。

            - boolean isEmpty():查询该Map 是否为空,即不包含key-value对时,如果为空则返回true。

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

            - 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。

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

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

        Entry包含如下三个方法:

            - Object getKey():返回该Entry里包含的key值。

            - Object getValue():返该Entry里包含的value 值。

            - Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。

        Java8为Map新增的方法:

            - Object compute(Object key, BiFunction remappingFunction):使用remappingFunction根据原key-value对计算一个新的value。只要新value不为null,就覆盖原value;如果原value不为null,新value为null,则删除原key-value对,如果原新value都为null,则返回null,不进行任何操作。

            - Object computeIfAbsent(Object key, Function mappingFunction):如果key对应的value为null,则使用mappingFunction根据key计算一个新的结果,如果新结果不为null则赋值给value;如果此Map不包含此key,则可能添加一组key-value对。

            - Object computeIfPresent(Object key, BiFunction remappingFunction):如果key对应的value不为null,则使用remappingFunction根据key、value计算一个新的结果,如果新结果不为null则赋值给value;如果计算结果为null,则删除key-value对。

            - void forEach(BiConsumer action):遍历key-value对的方法,接口方法将传入两个参数,即key和value。

            - Object getOrDefault(Object key, V defaultValue):获取key对应的value,如果key不存在,则返回默认值。

            - Object merge(Object key, Object value, BiFunction remappingFunction):获取key对应的value。如果value为null,则直接用向原value传入上面value值;如果value不为null,则根据原value和上面value计算一个新的结果去覆盖原value。

            - Object putIfPresent(Object key, Object value):如果key对应的value为null,则赋值新value。

            - Object replace(Object key, Object value):将key对应的value替换为新value。如果key不存在,则不会增加新的key-value对,并返回null。

            - Object replace(K key, V oldValue, V newValue):若找到指定的key-value对,则用新value替换旧value,并返回true,否则返回false。

            - Object replaceAll(BiFunction function):使用function对原key-value对计算产生一个新value。

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

    12.2 HashMap类

            Java8改进了HashMap的实现,在key冲突时依然具有较好的性能。

            Hash允许使用null作为key或value。为了成功的在HashMap中存储、获取对象,key的对象必须实现hashCode方法和equals方法,key的判定标准和重写规则与HashSet相同,value的判定标准为:只要两个对象通过equals方法比较返回ture即可。

            可变类作为key时,可能的错误与HashSet相同,即只能删除key没有被修改过的key-value对。

    12.3 LinkedHashMap类

            LinkedHashMap是HashMap的子类,使用双向链表维护key-value对的次序,迭代顺序与key-value对的插入顺序保持一致。

    12.4 Properties类

            Properties是Hashtable的子类,处理属性文件时比较方便。Properties里的key、value都是字符串类型。

        定义了如下三个操作方法:

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

    get(Object key)方法。

            - String getProperty(String key, String defaultValue):该方法与前一个方法基本相似。该方法多一个功能,如果Properties中不存在指定的key时,则该方法指定默认值。

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

        两个读写Field文件的方法:

            - void load(InputStream is):从属性文件中加载key-value对,把加载到的一key-value对追加到Properties里,不保证key-value对的顺序。

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

    12.5 TreeMap类

            TreeMap类实现了SortedMap接口,采用红黑树结构存储key-value对,根据key进行排序。可以采用自然排序或定制排序两种方式。如果两个key比较时返回0,则认为两个key相等。equals和比较方法重写时应保持一致。   

        TreeMap增加的方法:

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

            - Object firstKey():返回该Map中的最小key值。Map为空返回null。

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

            - Object lastKey():返该Map中的最大key值,如果Map为空或不存在此key,则都返回null。

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

            - Object higherKey(Obiect o):返回该Map中位于key后一位的key值(即大于指定key的最小key值)。如果该Map 为空或不存在这样的key-value对,则都返回null。

            - Map.Entry lowerEntry(Object o):返回该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,其 key的范围是大fromKey(包括)的所有key。

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

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

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

    12.6 WeakHashMap类

            用法与HashMap基本相似。

            WeakHashMap的key只保留了对实际对象的弱引用,这代表如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key对应的key-value对。

            当回收了该key所对应的实际对象之后,WeakHashMap会自动删除该key对应的key-value对。

    12.7 IdentityHashMap类

            用法与HashMap基本相似。

            在IdentityHashMap中,当且仅当两个key以==比较相等时,才认为两个key相等。IdentityHashMap允许key和value的值为null。

    12.8 EnumMap类

            EnumMap中的所有key都必须是同一个枚举类的枚举值。创建EnumMap时,必须显示或隐式指定枚举类。EnumMap提供了根据枚举类创建对象的构造器。

        EnumMap具有如下特征:

            - EnumMap内部以数组形式保存,数据紧凑、高效。

            - EnumMap根据key在枚举类中的顺序维护key-value对的顺序。

            - EnumMap不允许使用null作为key,但允许使用null作为value。

    12.9 各Map实现类的性能分析

            TreeMap通常比HashMap要慢,尤其是插入、删除key-value对时。但TreeMap的key-value对总是处于有序状态。在需要快速查询的Map集合时,可以选择使用HashMap;在需要一个元素能排序的Map集合时,可以选择使用TreeMap。

            LinkedHashMap比HashMap慢,因为内部使用链表维护key-value对的添加顺序。

            IdentityHashMap性能没有什么出色之处,实现方式与HashMap基本相似。

            EnumMap性能最好,但它只能以某一个枚举类的枚举值作为key。

    12.10 HashSet和HashMap的性能选项

            都是使用hash算法来决定元素或key的存储位置,并通过hash算法控制集合的大小。hash表里可以存储元素的位置被称为“桶”,发生“hash冲突”时,以链表形式存储冲突的元素。

        HashSet和HashMap的hash表包含如下属性:

            - 容量(capacity):hash表中桶的数量。

            - 初始化容量(initial capacity):创建hash表时桶的数量。HashSet和HashMap两个集合都允许在构造器中指定初始化容量。

            - 尺寸(size):当前hash表中记录的数量。

            - 负载因子(load factor):负载因子=size/capacity。负载因子为0时,表明hash为空表。

            - 负载极限:决定了hash表的最大填满程度。当hash表中的负载因子到达负载极限时,hash表就会成倍的增加容量,并将原有对象放入新桶内。默认负载极限为0.75

    相关文章

      网友评论

        本文标题:12 Java集合 - Map集合

        本文链接:https://www.haomeiwen.com/subject/msbotftx.html