流和不同操作

2022-09-01 04:33:29

我有以下代码:

class C
{
    String n;

    C(String n)
    {
        this.n = n;
    }

    public String getN() { return n; }

    @Override
    public boolean equals(Object obj)
    {
        return this.getN().equals(((C)obj).getN());
    }
 }

List<C> cc = Arrays.asList(new C("ONE"), new C("TWO"), new C("ONE"));

System.out.println(cc.parallelStream().distinct().count());

但我不明白为什么返回3而不是2。distinct


答案 1

您还需要重写类 中的方法。例如:hashCodeC

@Override
public int hashCode() {
    return n.hashCode();
}

当两个对象相等时,它们的方法必须返回相同的值。ChashCode

接口的 API 文档没有提到这一点,但众所周知,如果您覆盖 ,则还应该覆盖 。API 文档提到了这一点:StreamequalshashCodeObject.equals()

请注意,每当重写此方法时,通常需要重写该方法,以便维护该方法的一般协定,该协定规定相等的对象必须具有相等的哈希代码。hashCodehashCode

显然,确实使用了对象的哈希代码,因为当您像我上面显示的那样实现它时,您将获得预期的结果:2。Stream.distinct()


答案 2

推荐