• Map,HashMap,LinkedHashMap,TreeMap比较和理解


    /*
     * 获取功能:
     * V get(Object key):根据键获取值
     * Set<K> keySet():获取集合中所有键的集合
     * Collection<V> values():获取集合中所有值的集合
     */

    Map<String, String> map = new HashMap<String, String>();
    
            // 创建元素并添加元素
            map.put("邓超", "孙俪");
            map.put("黄晓明", "杨颖");
            map.put("周杰伦", "蔡依林");
            map.put("刘恺威", "杨幂");
    
            // V get(Object key):根据键获取值
            System.out.println("get:" + map.get("周杰伦"));
            System.out.println("get:" + map.get("周杰")); // 返回null
            System.out.println("----------------------");
    
            // Set<K> keySet():获取集合中所有键的集合
            Set<String> set = map.keySet();
            
            for (String key : set) {
                System.out.println(key);
            }
            System.out.println("----------------------");
    
            // Collection<V> values():获取集合中所有值的集合
            Collection<String> con = map.values();
            for (String value : con) {
                System.out.println(value);
            }

    遍历

    // 遍历
            // 获取所有的键
            Set<String> set = map.keySet();
            // 遍历键的集合,获取得到每一个键
            for (String key : set) {
                // 根据键去找值
                String value = map.get(key);
                System.out.println(key + "---" + value);
            }

    另一种方式遍历

    Set<Map.Entry<String, String>> set = map.entrySet();
            // 遍历键值对对象的集合,得到每一个键值对对象
            for (Map.Entry<String, String> me : set) {
                // 根据键值对对象获取键和值
                String key = me.getKey();
                String value = me.getValue();
                System.out.println(key + "---" + value);
            }

    当数据量大的时候,采用entrySet遍历key+value的效率要高于keySet(比较效率https://blog.csdn.net/zhangsify/article/details/52966094)

    //---------------------------------------------------------------------------------------------------------------------

    /*
     * HashMap:是基于哈希表的Map接口实现。
     * 哈希表的作用是用来保证键的唯一性的。
     *
     * HashMap<String,String>
     * 键:String(不允许重复)
     * 值:String(允许重复)
     */

    HashMap<String, String> hm = new HashMap<String, String>();
    
            hm.put("it001", "马云");
            hm.put("it003", "马化腾");
            hm.put("it004", "乔布斯");
            hm.put("it005", "张朝阳");
            hm.put("it002", "裘伯君"); // wps
            hm.put("it001", "比尔盖茨");
    
            // 遍历
            Set<String> set = hm.keySet();
            for (String key : set) {
                String value = hm.get(key);
                System.out.println(key + "---" + value);
            }

    结果

    it004---乔布斯
    it003---马化腾
    it005---张朝阳
    it002---裘伯君
    it001---比尔盖茨

    这里为什么键it001有两个选取最后一个 ,最后一个覆盖前面一个键

    //================================================================================

    /*
     * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
     * 由哈希表保证键的唯一性
     * 由链表保证键盘的有序(存储和取出的顺序一致)
     */

    LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();
    
            // 创建并添加元素
            hm.put("2345", "hello");
            hm.put("1234", "world");
            hm.put("3456", "java");
            hm.put("1234", "javaee");
            hm.put("3456", "android");
    
            // 遍历
            Set<String> set = hm.keySet();
            for (String key : set) {
                String value = hm.get(key);
                System.out.println(key + "---" + value);
            }

    TreeMap

    TreeMap<Student, String> tm = new TreeMap<Student, String>(
                    new Comparator<Student>() {
                        @Override
                        public int compare(Student s1, Student s2) {
                            // 主要条件
                            int num = s1.getAge() - s2.getAge();
                            // 次要条件
                            int num2 = num == 0 ? s1.getName().compareTo(
                                    s2.getName()) : num;
                            return num2;
                        }
                    });
    
            // 创建学生对象
            Student s1 = new Student("潘安", 30);
            Student s2 = new Student("柳下惠", 35);
            Student s3 = new Student("唐伯虎", 33);
            Student s4 = new Student("燕青", 32);
            Student s5 = new Student("唐伯虎", 33);
    
            // 存储元素
            tm.put(s1, "宋朝");
            tm.put(s2, "元朝");
            tm.put(s3, "明朝");
            tm.put(s4, "清朝");
            tm.put(s5, "汉朝");
    
            // 遍历
            Set<Student> set = tm.keySet();
            for (Student key : set) {
                String value = tm.get(key);
                System.out.println(key.getName() + "---" + key.getAge() + "---"
                        + value);
            }
    潘安---30---宋朝
    燕青---32---清朝
    唐伯虎---33---汉朝
    柳下惠---35---元朝

    //=========================================

    HashMap

    • 它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随机的(键唯一,取随机)
    • HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null(键可一null,值为所谓)
    • HashMap不支持线程的同步(即任一时刻可以有多个线程同时写HashMap),可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
    • Hashtable与 HashMap类似,它继承自Dictionary类。不同的是:它不允许记录的键或者值为空;它支持线程的同

    LinkedHashMap

    • LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。

    TreeMap

    • TreeMap实现SortMap接口,能够把它保存的记录根据键排序

    使用方式

    • 一般情况下,我们用的最多的是HashMap。HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
    • TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
    • LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。
  • 相关阅读:
    罗马数字转整数-算法练习
    无重复字符的最长字串-算法练习
    亲密字符串-算法刷题笔记
    0-n-1中缺失的数字-算法总结笔记
    高度检查表-算法笔记总结
    链表删除中间结点-算法练习总结
    链表中的中间结点-算法练习总结
    链表相交-算法练习总结
    多数元素-算法笔记总结
    Consul Windows集群搭建ACL Token验证
  • 原文地址:https://www.cnblogs.com/G-JF/p/9322207.html
Copyright © 2020-2023  润新知