• Java Map知识点


    1、遍历

    java遍历Map的方式有多种,一下以代码示例来说明使用:

            Map<String, String> tmap = new HashMap<String, String>(5);
    
            tmap.put("a", "aa");
            tmap.put("b", "bb");
            tmap.put("c", "cc");
            tmap.put("d", "dd");
            tmap.put("e", "ee");
    
            //常用方式
            System.out.println("************ 1 entrySet ************");
            for (Map.Entry<String, String> map : tmap.entrySet()) {
                String key = map.getKey();
                String value = map.getValue();
                System.out.println(key + ":" + value);
            }
    
            System.out.println("************ 2 iterator ************");
            Iterator<Map.Entry<String, String>> iterator = tmap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, String> next = iterator.next();
                System.out.println(next.getKey() + ":" + next.getValue());
            }
    
            //只需要map中的键或者值,可以通过keySet或values来实现遍历
            System.out.println("************ 3 keySet 通过键找值遍历(效率低)************");
            Set<String> keySet = tmap.keySet();
            for (String key : keySet) {
                String value = tmap.get(key);
                System.out.println(key + ":" + value);
            }
    
            System.out.println("************ 4 values ************");
            Collection<String> values = tmap.values();
            for (String value : values) {
                System.out.println(value);
            }
            
            //java8
            System.out.println("************ 5 java8 forEach ************");
            tmap.forEach((key, value) ->
                    System.out.println(key + ":" + value)
            );    

    2、常用Map

    2.1  常用Map有HashMap、LinkedHashMap、TreeMap三种:

    HashMap是常规的哈希表,查询以及插入的性能最好,在使用中用的较多,因为HashMap是线程不安全的,所以多线程中不好使用。

    LinkedHashMap可以指定遍历顺序或者按最近最少使用的顺序,它实现上继承了HashMap,只是比HashMap多维护了一个双链表,故查询及插入性能稍差于HashMap,遍历性能要好于HashMap。在按照元素添加顺序遍历,可以选择使用LinkedHashMap。示例:

            System.out.println("*******LinkedHashMap*******");
            //第三个参数设置true,表示按照访问顺序排序。每次访问一个元素(get或put),被访问的元素都被放到最后。
            LinkedHashMap linkedHashMap = new LinkedHashMap(16, 0.75f, true);
            linkedHashMap.put("1", "1");
            linkedHashMap.put("2", "2");
            linkedHashMap.put("3", "3");
            loopLinkedHashMap(linkedHashMap);
            linkedHashMap.get("1");
            loopLinkedHashMap(linkedHashMap);
            linkedHashMap.put("4", "4");
            loopLinkedHashMap(linkedHashMap);
            linkedHashMap.get("3");
            loopLinkedHashMap(linkedHashMap);
            linkedHashMap.put("5", "5");
            loopLinkedHashMap(linkedHashMap);
            linkedHashMap.get("2");
            loopLinkedHashMap(linkedHashMap);

    TreeMap是有序的,它将元素存储在一个红黑树中,存储在它里面的Key必须实现Comparable接口,key是从小到大排好序的。各项性能上相比HashMap来说较差。在需要存储元素需要有序时,可以选择TreeMap。

    2.2 同步 Map

    2.2.1 使用 Collections.synchronizedMap() 将未同步的 Map 转换为同步的 Map。例:

    HashMap<Integer,String> hashMap = new HashMap<>();
    Map<Integer,String> synchronizedMap = Collections.synchronizedMap(hashMap);

    2.2.2 ConcurrentReaderHashMap 和 ConcurrentHashMap。

    这些 Map 实现是线程安全的,并且不需要对并发访问或更新进行同步,同时还适用于大多数需要 Map 的情况。它们还远比同步的 Map(如 Hashtable)或使用同步的包装器更具伸缩性,并且与 HashMap 相比,它们对性能的破坏很小。util.concurrent 程序包构成了 JSR166 的基础;JSR166 已经开发了一个包含在 Java 1.5 版中的并发实用程序,而 Java 1.5 版将把这些 Map 包含在一个新的 java.util.concurrent 程序包中。

    ConcurrentHashMap<Integer,String> concurrentHashMap = new ConcurrentHashMap<>();

    示例代码Github

     

  • 相关阅读:
    [Linux 流量管理] Cacti的插件安装和使用
    expdp impdp 数据库导入导出命令详解
    Dropping all user tables/sequences in Oracle
    Oracle RMAN 的 show,list,crosscheck,delete命令整理
    EXP00041错误,遇到字符集问题的解决方式
    ORA00312的解决方法
    如何禁止MSN传递文件
    如何解决Parallel query大于1的问题
    bzoj5028小Z的加油店(线段树+差分)
    [转]C# 互操作性入门系列(三):平台调用中的数据封送处理
  • 原文地址:https://www.cnblogs.com/kingsonfu/p/10644504.html
Copyright © 2020-2023  润新知