黑马程序员技术交流社区

标题: HashMap 常见面试题 [打印本页]

作者: 逆风TO    时间: 2020-4-20 10:36
标题: HashMap 常见面试题
Map类的简略关系图:


思维导图


HashTable和HashMap的区别:

1、HashMap 线程不安全,可以放空key(只能放一个)

2、HashTable 线程安全,不可以放空key
存放空Key的hash值放在数组的哪个位置上:
存放在下标为0的位置上,也就是第一个链表的位置
HashMap1.7和HashMap1.8有什么区别:

1.7 底层用的是数组+链表实现的
1.8 底层用的是数组+链表+转换红黑树实现的
HashMap是如何解决Hash冲突问题的:
使用链表存放hash值相等且内容不等,存放在统一个链表中
HashMap的put方法底层是如何实现:

1、判断key如果为空的情况下,存放数组0
2、默认HashMap初始容量为16、负载因子大小 16*0.75 = 12 , 每次扩容 2 倍
3、根绝key计算hash值,存放到数组下标等于hash值的位置
4、如果计算出的hash值的位置已经存在数据(hash冲突),但是内容不等,则通过链表进行存储
5、如果当前size > 负载因子阈值,开始*2扩容
备注:1.8 中链表长度如果大于8的情况下,开始将链表转换为红黑树

之前小编写过HashMap put方法的源码分析,大家有兴趣可以去看一下:传送门

为什么负载因子是0.75:
空间利用率高、冲突少、0.75最合适
HashMap 1.7中数组扩容死循环的问题:
因为HashMap1.7 数组的扩容的链表采用头插入法,在多线程的情况下操作hashMap的话,导致死循环的问题

HashMap 根据key 获取值的时间复杂度是多少:
1、index没有冲突, 直接获取 ,O(1)
2、index有冲突,遍历链表, O(n)

为什么1.8,HashMap要引入红黑树?
如果index冲突过多,导致链表过长,遍历链表的时间复杂度为O(n)
而引入红黑树之后,遍历红黑树的时间负责度为n(logn)
注:当链表长度大于8并且数组容量大于64的请情况下,开始将链表转换为红黑

1.8的HashMap解决了1.7中的什么问题:
1、1.8采用的是尾插入法
2、解决了1.7HashMap死循环的问题
3、链表长度>8转换为红黑树

HashMap线程不安全,高并发的时候用什么呢?
ConcurrentHashMap 、或者使用Collecitons.synchronizedMap(map)

为什么不用HashTable呢?
因为HashTable用的是Synchronized锁,在高并发的情况下,很多线程去竞争一个锁,导致效率非常低下!

为什么用ConcurrentHashMap呢?
简单理解,就是 ConcurrentHashMap 内部是通过 继承ReentrantLock 的内部类(Segment类)来实现线程安全的 ,而且 里边的节点(Entry)也通过 volatile 修饰保证它的内存可见性。
而且ConcurrentHashMap在 1.7 和 1.8中也有所不同

具体可见:传送门

hashMap中的重要属性:

手写简单的HashMap
[Java] 纯文本查看 复制代码
package collection;

public class MapHashMap<K,V> {
    // 数组的长度
    private int size;
    // 定义数组
    private Entry<K,V>[] table;
    // 数组的默认初始长度
    private final int CAPACITY = 8;

    /**
     * 初始化数组容量
     */
    public MapHashMap() {
        this.table = new Entry[CAPACITY];
    }

    public int getSize(){
        return size;
    }

    /***
     * 数组中的节点
     * @param <K> key
     * @param <V> value
     */
    static class Entry<K,V>{
        final int hash;

        public int getHash() {
            return hash;
        }

        public K getKey() {
            return key;
        }

        public V getValue() {
            return value;
        }

        public Entry<K, V> getNext() {
            return next;
        }

        final K key;
        V value;
        Entry<K,V> next;

        public Entry(int hash, K key, V value, Entry<K, V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
    }

    /***
     * 根据key获取value
     * @param key key
     * @return value
     */
    public Object get(Object key){
        int hash = key.hashCode();
        int i = hash % CAPACITY;
        for(Entry<K,V> entry = table; entry != null; entry = entry.next){
            if(entry.key.equals(key)){
                return entry.value;
            }
        }
        return null;
    }


    public Object put(K key, V value){
        int hash = key.hashCode();
        int i = hash % CAPACITY;

        for(Entry<K,V> entry = table; entry != null; entry = entry.next){
            if(entry.key.equals(key)){
                V oldValue = entry.value;
                entry.value = value;
                return oldValue;
            }
        }
        addEntry(hash,key,value,i);

        return null;
    }

    void addEntry(int hash,K key, V value, int index){
        Entry entry = new Entry(hash,key,value,table[index]);
        table[index] = entry;
        size ++;
    }

    // 测试
    public static void main(String[] args) {
        MapHashMap mapHashMap = new MapHashMap();
        mapHashMap.put("213","123");
        System.out.println(mapHashMap.get("213"));
    }
}


简做总结,如有不足,欢迎指出


转自CSDN



作者: 咨询部王丹    时间: 2020-5-18 14:40
珍惜每一道题,加油
作者: 小公举    时间: 2020-5-18 14:41
感谢楼主的分享,谢谢啦!
作者: sdjadyhm    时间: 2020-5-18 15:00
6 666666666666
作者: sdjadyhm    时间: 2020-5-18 15:02
666666666
作者: hello!!!    时间: 2020-5-18 15:04

作者: 霍尔    时间: 2020-5-18 15:12
66666666666666
作者: 耙丫丫    时间: 2020-5-18 15:20
66666666666666666666666666
作者: 孙丽    时间: 2020-5-18 15:23
666666666666666666666666
作者: 孙丽    时间: 2020-5-18 15:24
666666666666666666

作者: 举个栗子    时间: 2020-5-18 15:30
666666666666666666666666666666
作者: 我爱我1022    时间: 2020-5-18 15:33

作者: 半个程序员    时间: 2020-5-18 15:41
总结很棒。。。。点赞,。
作者: 你不爱我    时间: 2020-5-18 15:43
厉害了                             
作者: manyihang    时间: 2020-5-18 17:17
6666666666666666666
作者: 逆风TO    时间: 2020-5-18 17:34
你只管去努力,剩下的交给天意。
作者: 大安    时间: 2020-5-18 17:39
感谢分享!
作者: jsnoob    时间: 2020-5-18 23:04
加油加油加油!!!
作者: yujq    时间: 2020-5-19 11:42
6666666666666666666666
作者: zplxwl    时间: 2020-5-19 15:32
666666666666666666
作者: 1467584    时间: 2020-5-20 09:56
66666666666666666666666666
作者: 黑马程序员啊    时间: 2020-5-20 10:21
66666666666666666666666666
作者: 王微    时间: 2020-5-20 11:41

作者: 殷凯老师    时间: 2020-5-20 17:33
感谢楼主的分享,谢谢啦!
作者: 零度☆黎明    时间: 2020-5-20 23:03
棒棒哒 ..................... ..................
作者: 素问    时间: 2020-5-21 00:29
感谢分享,继续加油~~~!!!!
作者: lvxinvip    时间: 2020-5-21 11:01

作者: kdhdjdj    时间: 2020-5-21 11:14
6666666666666666666666666
作者: kdhdjdj    时间: 2020-5-21 11:15

6666666666666666666666
作者: daoqin    时间: 2020-5-21 11:24
你开心就好喽
作者: hongping    时间: 2020-5-21 15:24
你开心就好啊
作者: hongping    时间: 2020-5-21 15:29
你开心就好啊
作者: 大智叔叔    时间: 2020-5-21 17:02
你开心就好啦
作者: 大智叔叔    时间: 2020-5-21 17:03
你开心就好啦
作者: zhaosongzhi    时间: 2020-5-21 17:09
666666666666666666
作者: 王锦    时间: 2020-5-21 17:09
6666666666666666666
作者: 哦嗨呦    时间: 2020-5-21 17:53
好人一生平安
作者: 我是小圆圆    时间: 2020-5-21 18:52
66666666666666666666
作者: lzq123    时间: 2020-5-21 20:28
666666666666666666
作者: 影@子~    时间: 2020-5-22 10:06

作者: 竹竹竹竹    时间: 2020-5-22 10:23
6666666666666666666666
作者: json0314    时间: 2020-5-22 20:59
666666666666666666666
作者: mydorling11    时间: 2020-5-23 18:48
yum install net-tools
作者: 逆风TO    时间: 2020-5-28 09:56
咨询部王丹 发表于 2020-5-18 14:40
珍惜每一道题,加油

努力学习,加油加油~
作者: 逆风TO    时间: 2020-5-28 09:57
小公举 发表于 2020-5-18 14:41
感谢楼主的分享,谢谢啦!

努力学习,加油加油~
作者: 逆风TO    时间: 2020-5-28 10:37
咨询部王丹 发表于 2020-5-18 14:40
珍惜每一道题,加油

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37
jsnoob 发表于 2020-5-18 23:04
加油加油加油!!!

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37
yujq 发表于 2020-5-19 11:42
6666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37
jsnoob 发表于 2020-5-18 23:04
加油加油加油!!!

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37
举个栗子 发表于 2020-5-18 15:30
666666666666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:37

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:38

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:38
半个程序员 发表于 2020-5-18 15:41
总结很棒。。。。点赞,。

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:38

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:38

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:38
jsnoob 发表于 2020-5-18 23:04
加油加油加油!!!

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:41
yujq 发表于 2020-5-19 11:42
6666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:41

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:41
逆风TO 发表于 2020-5-18 17:34
你只管去努力,剩下的交给天意。

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48
逆风TO 发表于 2020-5-28 10:37
加油啊  努力啊~

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48
1467584 发表于 2020-5-20 09:56
66666666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48
逆风TO 发表于 2020-5-28 10:48
加油啊  努力啊~

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48
素问 发表于 2020-5-21 00:29
感谢分享,继续加油~~~!!!!

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:48

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49
kdhdjdj 发表于 2020-5-21 11:14
6666666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:49

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50
kdhdjdj 发表于 2020-5-21 11:14
6666666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50
殷凯老师 发表于 2020-5-20 17:33
感谢楼主的分享,谢谢啦!

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50
逆风TO 发表于 2020-5-28 10:41
加油啊  努力啊~

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:50
逆风TO 发表于 2020-5-28 10:38
加油啊  努力啊~

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:51
1467584 发表于 2020-5-20 09:56
66666666666666666666666666

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:51

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:51

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:51

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:51

加油啊  努力啊~
作者: 逆风TO    时间: 2020-5-28 10:51

加油啊  努力啊~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2