zoukankan      html  css  js  c++  java
  • Java集合之Map

    Map基础介绍

    什么是map数据结构

    • 底层就是一个数组结构,数组中的每一项又是一个链表,即数组和链表的结合体
    • Table是数组,数组的元素时Entry
    • Entry元素时一个key-value键值对,它持有一个指向下一个Entry元素的引用,table数组的每个entry元素同时也作为当前Entry链表的首节点,也指向了该链表的下一个Entry元素

    常见的实现类

    HashMap

    • 一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射
    • 是基于hashing的原理,使用put(key,value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当put()方法传递键和值时,会先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来存储Entry对象的,是非线程安全的,所以HashMap从操作速度很快

    区别:乱序

    TreeMap

    • 在数据的存储过程中,能够自动对数据进行排序,实现了StoredMap接口,它是有序集合
    • TreeMap使用的存储结构是平衡二叉树,也成为红黑树
    • 默认排序规则:按照key的字典顺序来排序(升序),也可以自定义排序规则,要实现Comparator接口

    区别:按一定规则排序

    LinkedHashMap

    区别:放入怎样顺序,打印怎样顺序

    Map常用API

            HashMap<String, String> map=new HashMap<String, String>();
            //往map里面放key-value
            map.put("小陈", "上海");
            map.put("小红", "深圳");
            //根据key获取value
            String str=map.get("小陈");
            System.out.println(str);
            //判断是否包含某个key
            Boolean flag=map.containsKey("小陈");
            System.out.println(flag);
            //返回map的元素数量
            int size=map.size();
            System.out.println(size);
            map.put("小陈", "上海");
            System.out.println(map.size());
            Collection<String> values = map.values();
            for(String s:values) {
                System.out.println(s);
            }
            Set<Entry<String, String>> entrySet = map.entrySet();
            for(Map.Entry entry:entrySet) {
                System.out.println("key="+entry.getKey()+",value="+entry.getValue());
            }

    常见Map面试题(重要)

    HashMap和TreeMap如何选择

    1. HashMap可实现快速存储查询,但缺点是包含的元素是无序的,适合于在Map中插入、删除、查询
    2. TreeMap便捷的实现对其内部元素的各种排序,但其一般性能(插入、删除、查询)比HashMap差适用于自然顺序或自定义顺序遍历键(key)

    jdk1.7和jdk1.8中的HashMap的主要区别

    • 底层实现数组+链表改为数组+链表+红黑树

    什么时候开始转变

      当链表节点较少时仍然是以链表存在,当链表节点较多时,默认是大于8时会转为红黑树

  • 相关阅读:
    面试题八 二进制中 1 的个数
    面试题七 斐波那契数列
    面试题六 用两个栈实现队列
    第 3 章 第 2 题 求级数问题 递归法实现
    第 3 章 第 1 题 精简冗余 if 语句问题 使用数组实现
    第 2 章 第 10 题 测量电灯泡体积问题
    第 2 章 第 9 题 顺序 & 二分搜索效率分析问题
    带缓冲的IO( 标准IO库 )
    Linux 中权限控制实例
    Linux 中权限的再讨论( 下 )
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13383035.html
Copyright © 2011-2022 走看看