java中HashMap面试题及答案
时间: 2023-12-02 15:04:34 浏览: 34
Q: HashMap如何实现的,能否简单描述一下?
A: HashMap是基于哈希表的数据结构,它是由数组和链表构成的。当我们将一个键值对存储在HashMap中时,会首先根据键的哈希值计算出它在数组中的下标,如果该下标处已经有其他键值对了,那么它们就会以链表的形式存储在该位置,新的键值对就会被添加到链表的末尾。如果链表长度过长,就会转换成红黑树,以提高查询效率。
Q: HashMap的put方法是怎样实现的?
A: HashMap的put方法首先会根据键的哈希值计算出它在数组中的下标,然后在该位置进行插入操作。如果该位置已经有其他键值对了,就会遍历链表或红黑树,查找是否已经存在该键,如果存在就更新它的值,如果不存在就将它添加到链表或红黑树的末尾。如果链表长度过长,就会转换成红黑树。
Q: HashMap的get方法是怎样实现的?
A: HashMap的get方法首先会根据键的哈希值计算出它在数组中的下标,然后在该位置进行查找操作。如果该位置是空的,就返回null;如果该位置已经有其他键值对了,就遍历链表或红黑树,查找是否存在该键,如果存在就返回它的值,如果不存在就返回null。
Q: HashMap的扩容是怎样实现的?
A: HashMap的扩容是在当前容量达到阈值时进行的。扩容后的容量是原来容量的两倍,然后将原来的键值对重新分配到新的数组中。具体操作是遍历原来的数组,将每个键值对重新计算哈希值,并根据新的哈希值找到它在新数组中的位置,然后将它插入到该位置。如果该位置已经有其他键值对了,就遍历链表或红黑树,查找是否已经存在该键,如果存在就更新它的值,如果不存在就将它添加到链表或红黑树的末尾。如果链表长度过长,就会转换成红黑树。
Q: HashMap的并发问题怎样解决?
A: HashMap是非线程安全的,如果在多线程环境下使用,就会出现并发问题。Java提供了ConcurrentHashMap类来解决这个问题,它是线程安全的。ConcurrentHashMap使用分段锁来保证线程安全,将整个HashMap分成多个段,每个段都有自己的锁,不同的线程可以同时访问不同的段,从而提高了并发度。