当前位置: 首页 > 知识库问答 >
问题:

Java集不能区分不同的对象

穆鸿波
2023-03-14

我有一个类Human,它包含两个字段,age(int)和name(String)。在eclipse中,我用这两个字段重写hashCode()和equals()方法。我还根据年龄字段创建了一个比较器。

现在,我用年龄比较器创建了一个TreeSet对象,还创建了Human类的两个实例(具有不同的字段值)。然后我将这两个对象添加到集合中,然而,集合中总是只有一个对象。

为了理解问题,我打印了这两个对象的哈希值,发现它们是不同的。然后,我测试他们的equals()方法,当我比较两个具有不同字段值的实例时,它确实输出false。所以现在,我不明白为什么树集不能处理(区分)这个问题。有人能给我点帮助吗?多谢!

共有1个答案

孙斌
2023-03-14

TreeSet根本不使用hashcode()equals()。它使用作为参数传递的比较器(如果对象是可比较的,则使用对象的compareto()方法)。如果compare()(或compareto())在比较这两个对象时返回0,则树集认为这两个对象相等。

因此,如果你的比较者只比较人类的年龄,那么所有年龄相同的人类将被认为是相等的。如果您希望当人类具有相同的年龄和姓名时将其视为平等,那么比较器应该按年龄进行比较,如果年龄比较返回0,则按姓名进行比较。

 类似资料:
  • 我试图在repl中创建一些类,当我创建具有与第一个类相同属性的第二个类时,我被告知它已经定义了。 这仅仅是repl不能正确处理名称空间的问题吗?它在文件中按预期工作。 Perl6版本:这是Rakudo版本2018.10,构建于MoarVM版本2018.10之上,实现Perl 6。c

  • 问题内容: 我有一个可能具有或不具有相同属性值的对象的列表/集合。获得具有相同属性的对象的不同列表的最简单方法是什么?一种收集类型最适合此目的吗?例如,在C#中,我可以使用LINQ执行以下操作。 我最初的想法是使用lambdaj(链接文本),但似乎不支持此功能。 问题答案: 使用接口的实现(类T可能需要自定义方法,您可能必须自己实现)。通常,a 是开箱即用的:它使用和方法比较对象。对于简单的对象,

  • 我正在设计高通量系统,在那里我将有几个生产者。 我的主题将被分割。生产者将发送记录作为键值对。 键将用于对数据进行分区。 消费者将被组织在消费者组中(他们将被分配相同的组id,以便他们可以同时使用来自同一主题但来自不同分区的消息)。 Kafka保证消息在单个分区中的顺序。 消费者将被分配公平份额的分区。 唯一让我担心的是,我的分区键不会以循环方式分发消息,有些分区可能比其他分区更忙。 问:不均匀的

  • 我使用的是“亚洲/曼谷”区域id。该偏移是从格林尼治时间UTC 07:00开始的。 但是当我做了下面的事情时,设置为“01/01/1900 7:00:00.000”时不是7:00 结果就是 周一一月一日07:00:00 ICT 1900 -402 周一一月一日06:00:00 ICT 1900 -420 我想知道偏移量是否在1900年1月1日早上7点左右发生了变化,所以我在维基百科上查了一下。ht

  • 极端Java新手。我正在做一些简单的练习,以便练习语言的基本概念。 其中一个练习要求我实现一个MusicAlbum类,该类的实例属性之一是MusicTrack类的实例列表。 由于每个MusicTrack都必须通过其id进行唯一标识,并且考虑到所述列表必须“排序”(尽管没有实际的指示),我选择了树集。 因此,我在MusicTrack类中实现了Comparable,以便MusicBum的集合将根据它包

  • 我正在尝试构建一个选择唯一值组的查询。我知道如何对值进行分组并选择不同的值,但我不知道如何选择不同的值组,而不管所考虑元素的顺序如何。更准确地说: 我的XML是这样的: 在这里,我想将