• Java:集合,Map接口框架图


    Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。

    Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。本文仅探讨Map接口及其子接口、实现类。

    目录

    1. Map接口继承树
    2. Map接口的基本操作
    3. Map的遍历
    4. HashMap类和Hashtable类
      4.1 Properties类
      4.2 LinkedHashMap类
    5. SortedMap接口及其TreeMap实现类
    6. IdentityHashMap类
    7. EnumMap类
    8. 各种Map实现类选择策略 

    1. Map接口继承树

    2. Map接口的基本操作:

    • V put(K key, V value): 将指定的值与此映射中的指定键相关联(可选操作)。如果此映射中以前包含一个该键的映射关系,则用指定值替换旧值。
    • boolean containsKey(Object key): 如果此映射包含指定键的映射关系,则返回 true
    • boolean containsValue(Object value): 如果此映射为指定值映射一个或多个键,则返回 true
    • Set<Map.Entry<K,V>> entrySet(): 返回此映射中包含的映射关系的 set 视图。
    • V get(Object key): 返回指定key对应的value
    • V remove(Object key): 删除指定key对应的key-value对

    3. Map的遍历可以使用Iterator接口或者是foreach循环来实现

     参考:Java:集合,数组(Array)、集合(List/Set/Queue)、映射(Map)等的遍历,比如:ArrayList,LinkedList,HashSet,HashMap

    4. HashMap类和Hashtable类

    • Hashtable是线程安全的,而HashMap不是线程安全的。
    • Hashtable不允许null作为key和value,而HashMap则可以使用null作为key和value。

    不建议使用Hashtable类,它是一个很古老的类,从JDK1.0开始。如果要考虑线程安全,建议使用Collections工具类将HashMap转换为线程安全的。

    4.1 Properties类

    Properties类从Hashtable类继承而来。额外方法主要有:

    • void load(InputStream inStream): 从属性文件加载key-value对
    • void store(OutputStream out, String comments): 将当前的所有key-value对输出到指定属性文件
    • String getProperty(String key): 获取指定key对应的value值
    • String getProperty(String key, String defaultValue): 用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量。
    • Object setProperty(String key, String value): 调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。

    Properties还可以把key-value对以XML文件的格式保存,也可以从XML文件中加载。loadFromXML(InputStream in)及storeToXML(OutputStream os, String comment)。

    4.2 LinkedHashMap类

    LinkedHashMap从HashMap类继承而来。以链表来维护内部顺序。很多方面跟LinkedHashSet类似。LinkedHashMap它可以记住key-value对的添加时的顺序, 同时避免使用TreeMap时性能受到的影响。

    5. SortedMap接口及其TreeMap实现类

    类似于SortedSet及TreeSet,TreeMap也可以自定义比较器(Comparable)实现定制排序。它的额外提供的方法也与TreeSet类似,增加了访问第一个、前一个、后一个、最后一个key-value对的方法,并提供了从TreeMap中提取子集的方法。TreeMap不允许null作为key,要不然怎么比较呢?

    • firstEntry()/firstKey()/lastEntry()/lastKey()/higerEntry()/higerKey()/....../subMap(Object fromKey, Object toKey)/...

    6. IdentityHashMap类

    与HashMap的不同在于,只有两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等;而对于普通HashMap而言,只要key1.equals(key2)且hashCode相同即可。同样允许null值,不能保证顺序。

    7. EnumMap类

    EnumMap是一个与枚举类一起使用的Map实现。它的key必须是单个枚举类的枚举值。EnumMap不允许使用null作为key,但可作为value。《Effective Java》第33条,用EnumMap代替序数索引,一个稍复杂的应用:

    // Using a nested EnumMap to associate data with enum pairs - Pags 163-164
    import java.util.*;
    
    public enum Phase {
       SOLID, LIQUID, GAS;
    
       public enum Transition {
          MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID),
          BOIL(LIQUID, GAS),   CONDENSE(GAS, LIQUID),
          SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);
    
          private final Phase src;
          private final Phase dst;
            
          Transition(Phase src, Phase dst) {
             this.src = src;
             this.dst = dst;
          }
          // Initialize the phase transition map
          private static final Map<Phase, Map<Phase,Transition>> m =
            new EnumMap<Phase, Map<Phase,Transition>>(Phase.class);
          static {
             for (Phase p : Phase.values())
               m.put(p,new EnumMap<Phase,Transition>(Phase.class));
             for (Transition trans : Transition.values())
               m.get(trans.src).put(trans.dst, trans);
          }
    
          public static Transition from(Phase src, Phase dst) {
             return m.get(src).get(dst);
          }
       }
    
       // Simple demo program - prints a sloppy table
       public static void main(String[] args) {
           for (Phase src : Phase.values())
               for (Phase dst : Phase.values())
                   if (src != dst)
                       System.out.printf("%s to %s : %s %n", src, dst,
                                         Transition.from(src, dst));
       }
    }

    8. 各种Map实现类选择策略

    1. 正常情况使用HashMap,而不是Hashtable。
    2. 如果考虑排序,那么考虑使用TreeMap。通常TreeMap比HashMap等在插入、删除操作时要慢不少,因为它需要在底层采用红黑树来管理key-value对。
    3. 如果考虑插入时的顺序,那么使用LinkedHashMap是个不错的选择。
    4. 如果想优化垃圾回收,建议使用WeakHashMap实现类(本文未提及);要求key完全匹配(同一对象),则使用IdentityHashMap;还有枚举类不多说了。
    5. 关于null值:Hashtable不允许key为null,也不允许value为null;TreeMap与EnumMap不允许key为null;HashMap及其子类LinkedHashMap,IdentityHashMap允许key为null。
  • 相关阅读:
    java web数据可视化
    全国疫情统计可视化地图
    数组中的学问
    软件工程第二周开课博客
    梦断代码阅读笔记1
    补充urllib
    多用户登录
    学期课后个人总结
    团队冲刺第二十六天
    团队冲刺第二十五天
  • 原文地址:https://www.cnblogs.com/nayitian/p/3267110.html
Copyright © 2020-2023  润新知