为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2021-04-12 14:54:57
我有一个类型的对象列表,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添加以下代码后,类的实现工作即可:@Overridepublic int hashCode(){    return person.getName().hashCode();}覆盖后有人可以解释为什么hashCode()在Wrapper类distinct()的作品?
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

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

查看完整回答
反对 回复 2021-04-28
  • 3 回答
  • 0 关注
  • 203 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信