hashmap

HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

hashmap的常见面试题

1.面试官:HashMap的底层实现(如何解决hash冲突 ,负载因子)

java集合(5)—hashmap-LMLPHP

JDK1.8之后

相比于之前的版本, JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

java集合(5)—hashmap-LMLPHP

  1. · HashMap有一个叫做Entry的内部类,它用来存储key-value对。
  2. · 上面的Entry对象是存储在一个叫做table的Entry数组中。
  3. · table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
  4. · key的hashcode()方法用来找到Entry对象所在的桶。
  5. · 如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。
  6. · key的equals()方法用来确保key的唯一性。
  7. · value对象的equals()和hashcode()方法根本一点用也没有。

简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时, 也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

2.面试官:hashmap1.8为什么要采用红黑树而不是B树或者B+树呢?

3.面试官:为什么hashmap1.8不是一开始就用红黑树,而是要超过8以后才是使用红黑树呢?

4.面试官:hashmap的get操作

 

5.面试官:hashmap的put操作

6.面试官:平时在使用HashMap时一般使用什么类型的元素作为Key?

7.面试官:如果让你实现一个自定义的class作为HashMap的key该如何实现? 

8.面试官:hashcode equal

9.面试官:HashMap是线程安全的吗? 如果多个线程操作同一个HashMap对象会产生哪些非正常现象? 

10.面试官:HashMap中bucket的大小为什么是2的幂?

11.面试官:为什么HashMap中负载因子子是0.75?

12.面试官:HashMap 和 Hashtable 的区别

 

 

 

 

 

 

 

 

 

 

 

 

 

10-04 18:08