HashMap

面试题

Java中的HashMap的工作原理是什么?

  • Java中的HashMap是以键值对(key-value)的形式存储元素的。
  • HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。
  • 当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。
  • 如果key已经存在了,value会被更新成新值
  • HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

hashCode()和equals()方法的重要性体现在什么地方?

  • Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。
  • 如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。
  • 而且,这两个方法也用来发现重复元素。
  • 所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

HashMap和Hashtable有什么区别?

  • HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。
不同点:
  • HashMap允许键和值是null,而Hashtable不允许键或者值是null。
  • Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  • HashMap提供了可供应用迭代(Iterator)的键的集合,因此,HashMap是快速失败的。 另一方面,Hashtable提供了对键的列举(Enumeration)。
  • HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
  • 一般认为Hashtable是一个遗留的类。
posted @ 2021-01-13 00:24  张三丰学Java  阅读(161)  评论(0编辑  收藏  举报