zoukankan      html  css  js  c++  java
  • hashMap常见问题

    解析hashMap的源码实现】   

         点击进入hashMap的源码实现 

    0、谈谈对hashMap的理解?

    从底层结构、存取、扩容、冲突、实现原理、源码等方面说明。

    1、你知道哪些常用的Map集合?

        HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。 

    2、Collection集合接口和Map接口有什么关系?

        List,Set都是继承自Collection接口(单列集合),Map则不是(双列集合)。

    3、HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?

        HashMap不是线程安全的。

        线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap。

        性能最好的是ConcurrentHashMap。

    4、使用HashMap有什么性能问题吗?

        使用HashMap要注意避免集合的扩容。

        它会很耗性能(扩容后要进行索引重排),根据元素的数量给它一个初始大小的值。 

    5、HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?

        HashMap是数组和链表组成的。

        默认大小为16。

        当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。

    5.1为什么扩容是原先的两倍?【***】

        连接:hashMap的扩容机制resize()

        使用一个容量更大的数组来代替已有的容量小的数组,transfer()方法将原有Entry数组的元素拷贝到新的Entry数组里。

    6、怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?

        按添加顺序使用LinkedHashMap。

        按自然顺序使用TreeMap。

        按自定义排序TreeMap(Comparetor c)。 

    7、HashMap的链表结构设计是用来解决什么问题的?

        HashMap的链表结构设计是用来解决key的hash冲突问题的。 

    8、HashMap的键、值可以为NULL吗?HashTable呢?

        HashMap的键值都可以为NULL,HashTable不行。 

    9、HashMap使用对象作为key,如果hashcode相同会怎么处理?

        key的hash冲突,如果key equals一致将会覆盖值,不一致就会将值存储在key对应的链表中。

    10、HashMap中的get操作是什么原理?

        先根据key的hashcode值找到对应的链表,再循环链表,equals比较操作找到对应的值。

    11、hashCode相等的两个类一定相等吗?equals呢?相反呢?

        hashCoded相等的两个类不一定相等,equals相等了一定相等。

    12、介绍一下集合框架?单列集合、双列结合

      * Collection 一次存一个对象, 单列集合

      * List 可重复, 有索引,存取有序

       1、ArrayList 数组实现, 查找快,增删慢

        查找快是因为有索引,增删满是因为增删后需要进行索引重排。

       2、LinkedList 链表实现, 增删快

        增删快是因为需要进行索引重排,只需要改变链表元素前后的引用即可。

       3、Vector 数组实现, 线程安全

        线程安全是因为增删操作使用了synchronize同步锁。


      * Set 不可重复, 没索引,存取无序

       1、HashSet 使用哈希算法去重复, 效率高, 但元素无序

       2、TreeSet 使用二叉树算法排序, 可以指定元素的存储顺序

       3、LinkedHashSet HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序


      * Map 一次存两个对象, 键值对

       1、HashMap 使用哈希算法对键去重复, 效率高, 但无序

       2、TreeMap 使用二叉树算法排序, 可以自定义顺序

       3、LinkedHashMap 使用哈希算法去重复, 并且保留存储顺序

       4、Hashtable 类似HashMap, 线程安全, 效率略低, 不允许null键和null值

       5、SynchronizedHashMap

       6、ConcurrentHashMap 是并发包下线程安全的hashmap

        在JDK1.8以前ConcurrentHashMap 使用了分段加锁(原理)的方式保证了高效率的线程安全,JDK1.8及以后使用了红黑树和CAS算法保证ConcurrentHashMap 的线程安全。

    13、hashMap、hashTable、concurrentHashMap底层实现?

    hashMap:

        链表和数组的结合体

    hashTable:

        散列结构和hashmap一样

    concurrentHashMap:

    14、hashMap和treeMap的区别?底层用到什么数据结构?

        1、实现 (底层数据结构)

        TreeMap:SortMap接口,基于红黑树 

        HashMap:基于哈希散列表实现 

        2、存储 

        TreeMap:默认按键的升序排序 

        HashMap:随机存储 

        3、遍历 

        TreeMap:Iterator遍历是排序的 

        HashMap:Iterator遍历是随机的 

        4、性能损耗 

        TreeMap:插入、删除 

        HashMap:基本无 

        5、键值对 

        TreeMap:键、值都不能为null 

        HashMap:只允许键、值均为null 

        6、安全 

        TreeMap:非并发安全Map 

        HashMap:非并发安全Map 

        7、效率 

        TreeMap:低 

        HashMap:高

        *  一般情况下我们选用HashMap,因为HashMap的键值对在取出时是随机的,其依据键的hashCode和键的equals方法存取数据,具有很快的访问速度,所以在Map中插入、删除及索引元素时其是效率最高的实现。而TreeMap的键值对在取出时是排过序的,所以效率会低点。

    15、线程安全与线程不安全的集合?

        * 线程安全:

        StringBuffer、HashTable、Vector、SynchronizedHashMap、concurrentHashMap

        * 线程不安全:

        StringBuilder、HashMap、LinkedList、ArrayList、HashSet

    16、hashMap的原理,底层数据结构?*****

        底层使用 哈希表(数组+链表)的数据结构,当链表过长,会将链表转成红黑树以实现O(logn)时间复杂度查询。

    17、讲一讲hashMap中put方法的过程?*****

        1、对key求hash值,计算下标

        2、如果没有碰撞直接放入桶中

        3、如果碰撞了以链表的方式,连接到后边

        4、如果链表长度超过阈值(TREEIFY_THRESHOLD == 8)就把链表转成红黑树。

        5、如果节点已经存在就替换旧值。

        6、如果桶满了(容量*加载因子)就需要resize()扩容为原来的2倍。

    18、hashMap中的hash函数是怎么实现的?还有哪些hash的实现方式?*****

        1、高16bit不变,高16bit和低16bit做了一个异或。

        2、(n-1)& hash得到下标

        还有哪些hash实现方式,可以参考Effective Java 学习笔记 hashCode()

    19、hashMap是怎么解决hash冲突的,讲一下扩容过程,加入一个值在原数组中,现在移动了新数组,位置肯定变了,那是什么定位到了这个值在数据中的位置?*****

        1、将新节点加到链表后

        2、容量扩充为原来的两倍,然后对每个节点重新计算hash值。

        3、这个值只可能存在两个地方,一个是原下标的位置,另一种是在下标为<原下标 + 原容量的位置>。

    20、抛开hashMap,hash冲突有哪些解决办法?

        开放定址、链地址法。

    21、针对hashMap中某个Entrty链太长,查找的时间复杂度可能达到O(n)怎么优化?

        链表转为红黑树,JKD 1.8已经实现。

     

  • 相关阅读:
    fafu 1231 dp(线段树优化dp)
    OUTLOOK+VBA 备份邮件到GMAIL
    心灵的程序:佛学与计算机
    建议增加编辑器插件“自动排版”
    高效演讲:简单四步走
    找呀找呀找地铁
    为什么你总是烦?
    变形金刚之雷曼疯狂兔子:抽水马桶变身
    客观:别人的主观
    用VBSCRIPT朗读文本
  • 原文地址:https://www.cnblogs.com/luao/p/10903151.html
Copyright © 2011-2022 走看看