• Map集合面试题小结


     一.了解Map集合吗?Map集合都有哪些实现
      1.HashMap

      2.HashTable

      3.LinkedHashMap

      4.TreeMap

      5.ConcurrentHashMap

      

      二.HashMap和HashTable之间的区别
        1.HashMap:底层基于数组+单向链表(红黑树),非线程安全,默认容量为16,允许有空的键和值

              


              数组:Node<K,V> [] table ,每一个元素都是一个Node
              单向链表:Node<K,V> next,当发生Hash碰撞,会追加链表,当链表长度大于8,

              那就转换为红黑树
        2.HashTable:底层基于哈希表实现,线程是安全的,默认容量为11,不允许有空的键和值

      

      三.hashCode()和equals()方法使用场景
        hashCode():

            顶级父类Object当中的方法,返回值类型为int类型的值,根据一定的规则(存储地址,字段,长

            度等等)生成一个数组,数据保存的就是Hash值

        equals():

            顶级类Object中的方法,根据一定的比较规则,判断对象是否一致,底层一般逻辑:
                        1.判断两个对象的内存地址是否一样
                        2.非空判断和Class类型判断
                        3.强转
                        4.对象中的字段一一匹配

        

    public class UserInfo {
        private  Integer uid;
        private String uname;
    
        public Integer getUid() {
            return uid;
        }
    
        public void setUid(Integer uid) {
            this.uid = uid;
        }
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        //重写HashCode
        @Override
        public int hashCode(){
            return Objects.hash(uid,uname);
        }
    
        //重写equals
        @Override
        public  boolean equals(Object obj){
            //潘丹 两个对象对峙是否一致
            if (this==obj){
                return true;
            }
            //非空判断和class类类型判断
            if (obj==null||obj.getClass()!=getClass()){
                return false;
            }
            //强转
            UserInfo info=(UserInfo)obj;
            //判断对象字段值是否都是一致的
            return uid==info.uid && Objects.equals(uname,((UserInfo)obj).uname);
        }
        
    }

      四.HashMap和TreeMap应该如何选择
        HashMap:

          底层采用数组+链表(红黑树)结构,可以实现快速的存储和检索,但是数据是无序的,

          适用于在Map当中插入删除或者获取元素

        TreeMap:

           存储结构是一个平衡二叉树,具体实现方式为红黑树,默认采用自然排序,

          可以自定义排序规则,但是需要实现Comparator接口
          能够便捷的实现内部元素的各种排序,但是性能比HashMap差,适用于按照自然排序和自定义排序规则

      

      五.Set和Map的关系
        Set核心就是保存不重复的元素,存储一组唯一的对象
        set当中每一种实现都对应Map
        HashSet对应的HashMap,TreeSet对应的TreeMap

        进入HashSet源码

        

        底层实际上是创建 了一个HashMap集合

         

         

        进入HashMap源码

        

         实际上HashMap底层调用的是Set

        

      六.常见的Map排序规则
        按照添加规则使用LinkedHashMap,按照自然排序或者自定义规则排序可以采用TreeMap

      

      七.如何保证Map线程安全
        多线程环境下,可以使用concurrent包下有一个ConcurrentHashMap或者是使用

        Collections.synchronizedList(newHashMap<K,V>());

      

      ConcurrentHashMap保证线程安全,效率比HashTable高,采分段锁

      

  • 相关阅读:
    LeetCode 1672. 最富有客户的资产总量
    LeetCode 455. 分发饼干
    Linux上安装docker并设置免sudo权限与国内镜像源
    Java后端期末复习
    Windows 10 家庭版开启本地安全策略 关闭管理员权限提升
    C语言中两种交换变量值方法的速度测试
    jQuery动态生成元素无法绑定事件的解决办法
    JQuery绑定事件处理动态添加的元素
    Socket通信服务端和客户端总结
    js传函数指针
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12504651.html
Copyright © 2020-2023  润新知