面试题答案
一键面试底层数据结构选择
选择ConcurrentHashMap作为底层数据结构。ConcurrentHashMap在高并发场景下具有较好的性能,它通过分段锁机制允许多个线程同时操作不同的段,减少锁竞争。
保证线程安全
- 利用ConcurrentHashMap特性:ConcurrentHashMap本身就是线程安全的,它在设计上采用了锁分段技术,不同的线程可以同时访问不同的段,从而提高并发性能。
优化哈希冲突
- 合理设置初始容量:根据预期元素数量设置合适的初始容量,减少哈希冲突的概率。例如,若预计元素数量为n,可以设置初始容量为大于n的最小的2的幂次方。
- 使用更好的哈希算法:ConcurrentHashMap默认使用的哈希算法已经经过优化。但在自定义场景下,可以根据数据特点设计更适合的哈希算法,尽量让元素均匀分布在哈希表中。
关键代码片段
import java.util.concurrent.ConcurrentHashMap;
public class CustomSet<T> {
private final ConcurrentHashMap<T, Object> map;
private static final Object PRESENT = new Object();
public CustomSet() {
map = new ConcurrentHashMap<>();
}
public boolean add(T element) {
return map.putIfAbsent(element, PRESENT) == null;
}
public boolean remove(T element) {
return map.remove(element, PRESENT);
}
public boolean contains(T element) {
return map.containsKey(element);
}
}
设计思路
- 数据存储:利用ConcurrentHashMap存储Set中的元素,以元素作为键,值使用一个固定的Object对象(这里定义为PRESENT)。
- 添加操作:add方法使用putIfAbsent方法,如果元素不存在则添加并返回null,否则返回已存在的值,通过判断返回值确定元素是否成功添加。
- 删除操作:remove方法使用ConcurrentHashMap的remove方法,通过传入元素和PRESENT来删除元素,只有当元素存在且值为PRESENT时才会删除成功。
- 查找操作:contains方法使用containsKey方法判断元素是否存在于ConcurrentHashMap中。