猿问

为什么Object.equals(Object o)在Java中需要Object.hashCode?

我有一个类型的对象列表,Person我想使用流摆脱具有相同名称的元素。我在互联网上发现了使用Wrapper类的建议,到目前为止,我的代码看起来像这样:


List<Person> people = Arrays.asList(new Person("Kowalski"),

                                    new Person("Nowak"),

                                    new Person("Big"),

                                    new Person("Kowalski"));


List<Person> distPeople = people.stream()

        .map(Wrapper::new)

        .distinct()

        .map(Wrapper::unwrap)

        .collect(Collectors.toList());

在文档中,据说 distinct()


返回由该流的不同元素组成的流(根据Object.equals(Object))。


那样的实现是Wrapper行不通的(我用两个Kowalski得到了相同的流):


public class Wrapper

{

    private final Person person;


    Wrapper(Person p)

    {

        person = p;

    }


    public Person unwrap()

    {

        return person;

    }


    public boolean equals(Object other)

    {

        if(other instanceof Wrapper)

            return ((Wrapper) other).person.getName().equals(person.getName());

        else

            return false;

    }

}

Wrapper添加以下代码后,类的实现工作即可:


@Override

public int hashCode()

{

    return person.getName().hashCode();

}

覆盖后有人可以解释为什么hashCode()在Wrapper类distinct()的作品?


慕哥9229398
浏览 204回答 3
3回答

一只名叫tom的猫

答案就在全班DistinctOps。该方法makeRef用于返回ReferencePipeline包含不同元素的实例。此方法LinkedHashSet用于执行reduce操作以获得不同的元素。请注意,它从中LinkedHashSet扩展用于存储元素。现在序的正常工作,你应该提供实现其遵循的正确合同和与therfore,需要您提供一个实现,使正常工作。HashSetHashMapHashMaphashCode()hashCode()equals()hasCode()Stream#distinct()
随时随地看视频慕课网APP

相关分类

Java
我要回答