HashSet插入相等对象时能否返回集合中已存在的重复实例?
方案说明
是可行的,但JDK自带的HashSet没有直接提供对应方法,你可以通过以下两种方式实现需求:
方案1:改用HashMap实现(推荐)
HashSet底层本身就是基于HashMap封装实现的,只是把所有value指向了同一个静态占位对象,没有存储实际元素引用,所以没法直接返回已存在的对象。你完全可以直接用HashMap替换HashSet,由于你已经重写了SomeClass的hashCode和equals方法,直接把对象本身作为key、value也存对象即可,逻辑和HashSet完全一致:
HashMap<SomeClass, SomeClass> map = new HashMap<>(); SomeClass a = new SomeClass(3, 5); SomeClass b = new SomeClass(3, 6); // 插入a map.put(a, a); // 尝试插入b SomeClass existedObj = map.putIfAbsent(b, b); if (existedObj != null) { // 插入失败,existedObj就是集合中已存在的a对象,可以直接检查属性 System.out.println("已存在同x值对象,对应y值为:" + existedObj.y); }
如果你不想用对象作为key,也可以单独用判等的核心字段x作为key,效果是一样的。这个方案性能和原生HashSet完全一致,没有额外开销,是业内通用的实现方式。
方案2:封装自定义HashSet
如果你必须保留HashSet的使用接口,可以自己继承HashSet封装对应的查询方法,内部基于HashMap存储实现即可,示例如下:
public class CustomHashSet<E> extends HashSet<E> { private final HashMap<E, E> map = new HashMap<>(); @Override public boolean add(E e) { E existed = map.putIfAbsent(e, e); return existed == null; } public E getDuplicateOf(E e) { return map.get(e); } }
使用时直接调用customSet.getDuplicateOf(b)就能拿到已存在的对象。
内容的提问来源于stack exchange,提问作者Abdulmalek Almkainzi
相关产品推荐
相关产品推荐

