You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:51:02