• 双列集合map面试题


    一.了解Map集合吗?Map集合都有哪些实现
      1.HashMap   HashTable    LinkedHashMap   TreeMap   ConcurrentHashMap
     
     二.HashMap和HashTable之间的区别

     HashMap不是线程安全的

                HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。

      HashTable是线程安全

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

      1.HashMap:底层基于数组+单向链表(红黑树),非线程安全,默认容量为16,允许有空的键和值
       数组:Node<K,V> [] table ,每一个元素都是一个Node
       单向链表:Node<K,V> next,当发生Hash碰撞,会追加链表,当链表长度大于8,那就转换为红黑树
      2.HashTable:底层基于哈希表实现,线程是安全的,默认容量为11,不允许有空的键和值
     
     三.hashCode()和equals()方法使用场景

    hashCode()方法用于获取给定对象的唯一的整数。当这个对象需要存储在哈希表这样的数据结构时,这个整数用于确定桶的位置。默认情况下,对象的hashCode()方法返回对象所在内存地址的整数表示。

    equals()方法用来简单验证两个对象的相等性。默认实现只检查两个对象的对象引用,以验证它们的相等性。

      hashCode():顶级父类Object当中的方法,返回值类型为int类型的值,根据一定的规则(存储地址,字段,长度等等)生成一个数组,数据保存的就是Hash值
      equals():顶级类Object中的方法,根据一定的比较规则,判断对象是否一致,底层一般逻辑:
       1.判断两个对象的内存地址是否一样
       2.非空判断和Class类型判断
       3.强转
       4.对象中的字段一一匹配
     
     四.HashMap和TreeMap应该如何选择

      HashMap:底层采用数组+链表(红黑树)结构,可以实现快速的存储和检索,但是数据是无序的,适用于在Map当中插入删除或者获取元素
      
      TreeMap: 存储结构是一个平衡二叉树,具体实现方式为红黑树,默认采用自然排序,可以自定义排序规则,但是需要实现Comparator接口
         能够便捷的实现内部元素的各种排序,但是性能比HashMap差,适用于按照自然排序和自定义排序规则
     

    TreeMap取出来的是排序后的键值对。插入、删除需要维护平衡会牺牲一些效率。但如果要按自然顺序或自定义顺序遍历,那么TreeMap会更好。
    HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap。HashMap通常比TreeMap效率要高一些,一个是哈希表,一个是二叉树,建议多使用HashMap,在需要排序的Map时候才用TreeMap。HashMap的查询速度比TreeMap要快


     五.Set和Map的关系
      Set核心就是保存不重复的元素,存储一组唯一的对象
      set当中每一种实现都对应Map
      HashSet对应的HashMap,TreeSet对应的TreeMap
     
     六.常见的Map排序规则
      按照添加规则使用LinkedHashMap,按照自然排序或者自定义规则排序可以采用TreeMap
     
     七.如何保证Map线程安全
      多线程环境下,可以使用concurrent包下有一个ConcurrentHashMap或者是使用Collections.synchronizedList(new HashMap<K,V>());
      
      ConcurrentHashMap保证线程安全,效率比HashTable高,采分段锁
      
     

  • 相关阅读:
    Java 对文件的操作
    快速排序算法
    Java 时间和字符换的处理
    Redis 数据结构之Keys
    [转] Redis系统性介绍
    【转】JAVA 接口
    [转] Python 代码性能优化技巧
    几道关于面试的题目
    随手笔记2
    随手笔记
  • 原文地址:https://www.cnblogs.com/mayuan01/p/12506013.html
Copyright © 2020-2023  润新知