面试题
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)
评论()
编辑
收藏
举报