解决Hash冲突的方法,HashMap采用了什么方法解决Hash冲突?
HashMap使用哈希表来存储数据的,当然哈希表不可避免的就会遇到hash冲突问题,解决hash冲突的方法大致有两种:1,开放地址法。2,链地址法。
1,开放地址法:当地址发生冲突时,按着某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。
2,链地址法:链地址法就是数组加链表的结合,在每一个数组元素上都有一个链表结构,当地址发生冲突时就讲数据存放在链表中。
而HashMap就是采用链地址法进行解决hash冲突的。
HashMap初始值的大小和负载因子的大小?
hashMap初始长度就是16,负载因子是0.75。HashMap所容纳的最大数据量为:长度*负载因子。即当长度达到这个值的时候就会发生扩容。
如果两个键的hashcode相同,你如何获取值对象?
HashMap会使用键对象的hashcode找到bucket位置,找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素
我们能否让HashMap同步?
通过Map m = Collections.synchronizeMap(hashMap)实现同步。在synchronizeMap中给HashMap的所有操作增加synchronized竞争监视器锁来实现线程同步。
为什么HashMap是线程不安全的?如何体现出不安全的?
当多个线程对HashMap就行put操作时,如果put的key相同会产生碰撞,那么HashMap会将两个key放在数组的同一位置,其中一个线程的key会被覆盖。
hashmap底层的get方法
get()首先通过计算key的hash值找到在数组中的下标,若下标处元素为空则直接返回null,否则判断该下标处元素是否是要查找的元素,是就直接返回,不是就判断该元素节点是否为红黑树节点,是就进行红黑树节点的查找,否则遍历链表进行查找。