• Java Map 集合实现类


    Map 用于保存具有映射关系的数据,集合里会保存两组值,一组用于保存Map里的key,一组用于保存Map里的value,key与map可以是任何引用类型数据。Map的key不允许重复。key与value是单向的一一对应关系,即通过key值总能找到唯一确定的value。

     

    1 Map常用方法

    • void clear():清除Map集合里的所有元素
    • boolean containsKey(Object key):查询Map是否包含指定的key,包含则返回true
    • Set entrySet():返回Map中包含key-value对所组成的Set集合,每个集合元素都是Map.Entry对象
    • Object get(Object key):返回指定key所对应的value,如果此Map不包含此key,返回null
    • Set keySet():返回该Map中所有key组成的Set集合
    • Object put(Object key, Object value):添加一个key-value对,如果key已经存在,则会覆盖
    • void putAll(Map m):将指定的Map集合复制到本Map
    • Object remove(Object key):删除指定key对应的key-value对
    • int size():返回Map元素的个数
    • Collection values():返回Map里所有value组成的Collection

      

      2 HashMap 与Hashtable

    HashMap与Hashtable都是Map接口的实现类,它们之间的关系类似与ArrayList与Vector:Hashtable是一个古老的Map实现类,从JDK1.0就有了,从它的命名就可以看出,甚至没有遵循Java命名规范。

    • Hashtable是线程安全的,HashMap不是,所以HashMap性能要好些
    • Hashtable不允许使用null作为key与value,HashMap可以,但是也只能存储一个null作为key值
    • HashMap是无序的

      

     1         
     2         HashMap<String, String> hash = new HashMap<String, String>();
     3         hash.put("吴国谋士", "周瑜");
     4         hash.put("蜀国军师", "诸葛亮");
     5         hash.put("魏国谋士", "郭嘉");
     6         
     7         //foreach遍历
     8         for(Object key:hash.keySet())
     9         {
    10             String name = hash.get(key);
    11             System.out.println(key+"-->"+name);
    12         }
    13         
    14         //Iterator遍历
    15         Iterator iter = hash.keySet().iterator();
    16         while(iter.hasNext())
    17         {
    18             String key = (String)iter.next();
    19             String name = hash.get(key);
    20             System.out.println(key+"-->"+name);
    21         }
    22         
    23         //将HashMap转为Set,Set里存储的是Map.Entry<K, V>
    24         Set set = hash.entrySet();
    25         Iterator iter1 = set.iterator();
    26 
    27         while(iter1.hasNext())
    28         {
    29             Map.Entry<String, String> item = (Map.Entry<String, String>)iter1.next();
    30             System.out.print(item.getKey()+"-->"+item.getValue()+"  ");
    31         }

    HashMap中存储、获取对象,其中用作key的对象必须实现hashCode方法与equals方法,类似与HashSet,HashMap判断两个key值相等的标准也是:两个key 通过equals()比较返回true,那么两个key的hashCode值也相等。相对key的判断,value的判断就要简单些,两个value只需要通过equals()比较返回true即可。

    关于HashSet,HashMap的equals()与hashCode()重写:http://www.cnblogs.com/Latiny/p/8359088.html

     

    3 LinkedHashMap

    LinkedHashMap是HashMap的子类,类似于LinkedHashSet,也是使用双向链表来维护key-value对的次序(其实只需要考虑key的次序),该链表负责维护Map的迭代顺序,迭代顺序与key-value插入顺序一致。LinkedHashMap可以避免对HashMap里的key-value对进行排序,同时又可避免使用TreeMap所增加的成本。由于它需要维护元素的插入顺序,因此性能略低于HashMap,但是因为它以链表来维护内部顺序,所以在迭代访问Map里的全部元素时有较好的性能。

     1         
     2         LinkedHashMap map = new LinkedHashMap();
     3         map.put("Lakers", "KOBE");
     4         map.put("Celtics", "Irving");
     5         map.put("Warries", "KD");
     6         map.put("Cavaliers", "James");
     7         
     8         Iterator iter= map.keySet().iterator();
     9         while(iter.hasNext())
    10         {
    11             String key = (String)iter.next();
    12             System.out.println(key+"-->"+map.get(key));
    13             
    14         }
    15         
    16         for(Object key:map.keySet())
    17         {
    18             System.out.println(key+"-->"+map.get(key));
    19         }
    20         

      输出结果:

    Lakers-->KOBE
    Celtics-->Irving
    Warries-->KD
    Cavaliers-->James

    可以看到LinkedHashMap遍历的顺序是插入时的顺序,与HashMap截然不同,HashMap遍历的结果是无序的。

      

      4 TreeMap

    TreeMap与TreeSet类似,也是一个红黑树结构。每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap可以保证所有key-value对处于有序状态。TreeMap额外提供了一系列根据key值访问key-value的方法

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

    Map.Entry() lastEntry():返回该Map中最大key所对应的key-value对,如果该Map为空,则返回null

    Object firstKey():返回该Map中最小的key值

    Object lastKey():返回该Map中最大的key值

     

     

  • 相关阅读:
    算法——二分法实现sqrt
    java——>> 和>>>
    算法——求n对()有多少种输出方式?
    算法——得到数据流中前K大的数
    SpringBoot+Rocketmq
    jvm——metaspace代替永久代
    rmq——同步、异步、单向、rocketMQ console、消费模式
    三级缓存架构
    kafka——分布式的消息队列系统
    [bzoj 2957] 楼房重建
  • 原文地址:https://www.cnblogs.com/Latiny/p/8353696.html
Copyright © 2020-2023  润新知