首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么即使Treeset<Object> ()和Object.compareTo()是一致的,Object.equals contains()也会返回false呢?

即使 TreeSet<Object>()Object.compareTo() 是一致的,Object.equals()contains() 也会返回 false 的原因是因为它们依赖于不同的方法来进行比较。

TreeSet 中,元素的排序是基于元素的比较方法,即 compareTo() 方法。compareTo() 方法是在对象实现了 Comparable 接口的前提下使用的,用于定义对象之间的自然顺序。当 TreeSet 在添加元素时,它会使用 compareTo() 方法来确定元素的位置。

另一方面,equals() 方法是用来检查两个对象是否相等的,默认情况下,它使用对象的引用进行比较,即检查两个对象是否是同一个对象。但是,可以通过覆盖 equals() 方法来定义对象之间的相等性规则。

contains() 方法会首先使用 equals() 方法来检查集合中是否存在相同的元素。如果两个对象相等,则 contains() 方法会返回 true,否则返回 false

由于 TreeSet 使用 compareTo() 方法来进行元素的排序,而 contains() 方法使用 equals() 方法来检查元素的相等性。即使 compareTo() 方法返回相等,但是 equals() 方法可能被覆盖为根据对象的内容进行比较。因此,当 equals() 方法与 compareTo() 方法的行为不一致时,contains() 方法会返回 false

总结:即使 TreeSet<Object>()Object.compareTo() 是一致的,Object.equals()contains() 也会返回 false,因为它们依赖于不同的方法进行比较,TreeSet 使用 compareTo() 方法进行排序,而 contains() 使用 equals() 方法进行元素的相等性检查。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Comparable ComparatorComparable 自然排序

(e2) < 0 即 e1 < e2 1.由于 null 不是一个类,不是一个对象,因此在重写 compareTo 方法时应该注意 e.compareTo(null) 情况,即使 e.equals...(null) 返回 false,compareTo 方法应该主动抛出一个空指针异常 NullPointerException 2.Comparable 实现类重写 compareTo 方法时一般要求...这样将来使用 SortedSet 等根据类自然排序进行排序集合容器时可以保证保存数据顺序想象中一致。 上面的第二点如果违反了怎样?... size 不会增加,因为在 SortedSet 看来它们相同 实际上所有实现了 Comparable 接口 Java 核心类结果都 equlas 方法保持一致 实现了 Comparable...有些场景下equalscompareTo 结果要保持一致,这时候不重写equals(),使用 Object.equals 方法得到结果会有问题,比如说HashMap.put(),先调用 key

75370

Java 解惑:Comparable Comparator 区别

< 0 即 e1 < e2 注意: 1.由于 null 不是一个类,不是一个对象,因此在重写 compareTo 方法时应该注意 e.compareTo(null) 情况,即使 e.equals...(null) 返回 false,compareTo 方法应该主动抛出一个空指针异常 NullPointerException。...这样将来使用 SortedSet 等根据类自然排序进行排序集合容器时可以保证保存数据顺序想象中一致。 有人可能好奇上面的第二点如果违反了怎样?...size 不会增加,因为在 SortedSet 看来它们相同,而 SortedSet 中不允许重复。...感谢 @li1019865596 指出,这里我想表达在有些场景下 equals compareTo 结果要保持一致,这时候不重写 equals,使用 Object.equals 方法得到结果会有问题

1.7K100
  • 四大集合20连问,抗住!

    Set集合为什么要叫Set?因为Set集合命名取自于我们小学数学里集合论(Set Theory),数学集合一个很重要概念就是每个元素值都互不相同。...轮到你了,TreeSet。我们南友们很好奇为什么他叫TreeSet? 因为他基于TreeMap实现。。。...Queue集合底层接口提供方法很简单,一共有 6 个。 // 添加元素。没有可用元素则简单返回false boolean offer(E e); // 添加元素。...transient Object[] elements; 为什么要这么设计?其实这两种不同设计就可以高效适用于不同业务场景。...对于PriorityQueue来说,它只保证你使用poll()操作时,返回队列中最小、或最大元素。 3.4 阻塞队列 面试官:阻塞队列

    14454

    《Effective Java》读书笔记(二)之对于所有对象都通用方法

    那什么情况应该覆盖Object.equals?...那么y.equals(x)必须为true 3)传递性:对于任何非null引用值xyz,如果x.equals(y)为true,y.equals(z);那么x.equals(x)必须为true...4)一致性:对于任何非null引用值xy,如果用于equals比较对象信息没有被修改的话,那么多次调用x.dquals(y)返回一致 5)对于非null引用值x,x.equals...方法不知道要不区分大小写1,所以s.equals(cis)返回false,违反了自反性 假如你把CaseInsensitiveString 放到一个集合中 List<CaseInsensitiveString...,可能false,甚至抛出RumtimeException 为了解决这个问题,只要企图与String互操作这段代码从equals去掉即可 @Override public boolean

    30110

    Java Set集合详解

    如果对两个引用调用hashCode方法,会得到相同结果,如果对象所属类没有覆盖ObjecthashCode方法的话,hashCode返回每个对象特有的序号(java依据对象内存地址计算出此序号...如果想要让两个不同Person对象视为相等,就必须覆盖Object继下来hashCode方法equals方法,因为Object hashCode方法返回该对象内存地址,所以必须重写hashCode...如果equals 为false就不是同一个元素。 哈希值相同equals为false元素怎么存储,就是在同样哈希值下顺延(可以认为哈希值相同元素放在一个哈希桶中)。也就是哈希一样存一列。...通过hashCode方法equals方法来保证元素唯一性,add()返回boolean类型 判断两个元素是否相同,先要判断元素hashCode值是否一致,只有在该值一致情况下,才会判断equals...此时就需要进行次要条件判断(需要判断姓名),只有姓名年龄同时相等才可以返回0.) 通过return 0来判断唯一性。 问题:为什么使用TreeSet存入字符串,字符串默认输出按升序排列?

    43231

    Java内功心法,Set集合详解 ​

    如果对两个引用调用hashCode方法,会得到相同结果,如果对象所属类没有覆盖ObjecthashCode方法的话,hashCode返回每个对象特有的序号(java依据对象内存地址计算出此序号...如果想要让两个不同Person对象视为相等,就必须覆盖Object继下来hashCode方法equals方法,因为Object hashCode方法返回该对象内存地址,所以必须重写hashCode...如果equals 为false就不是同一个元素。 哈希值相同equals为false元素怎么存储,就是在同样哈希值下顺延(可以认为哈希值相同元素放在一个哈希桶中)。也就是哈希一样存一列。...通过hashCode方法equals方法来保证元素唯一性,add()返回boolean类型 判断两个元素是否相同,先要判断元素hashCode值是否一致,只有在该值一致情况下,才会判断equals...此时就需要进行次要条件判断(需要判断姓名),只有姓名年龄同时相等才可以返回0.) 通过return 0来判断唯一性。 问题:为什么使用TreeSet存入字符串,字符串默认输出按升序排列?

    50230

    Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet区别?

    :1、存储数据不重复,但add重复数据并不报错,原因第一个数据会被第二次重复数据覆盖掉;2,无序,很多人发现输出了一个有序数字集合,这个其实与我们所说有序有区别的,在Set中有序无序指输入顺序与输出顺序是否一致...无序性:所谓无序性不等于随机性,不等于输出无序,就如同上面我们看到向HashSet中随机添加数字,输出从大到小,看似有序,实际此序非彼序!...不可重复性:指添加元素按照 equals() 判断时 ,返回 false,因此,实现不可重复性,必须要同时重写 equals() 方法 hashCode() 方法。...LinkedHashSet 那么有的小伙伴问了:“我就想存一个不重复数据集合,同时又想要他们有序怎么办?”,Java开发人员已经早就为你想到了,这个办法就是用LinkedHashSet!...LinkedHashSet 底层数据结构链表哈希表,元素插入取出顺序满足 FIFO。TreeSet 底层数据结构红黑树,元素有序,排序方式有自然排序定制排序。

    12700

    java set集合详解

    如果对两个引用调用hashCode方法,会得到相同结果,如果对象所属类没有覆盖ObjecthashCode方法的话,hashCode返回每个对象特有的序号(java依据对象内存地址计算出此序号...如果想要让两个不同Person对象视为相等,就必须覆盖Object继下来hashCode方法equals方法,因为Object hashCode方法返回该对象内存地址,所以必须重写hashCode...如果equals 为false就不是同一个元素。 哈希值相同equals为false元素怎么存储,就是在同样哈希值下顺延(可以认为哈希值相同元素放在一个哈希桶中)。也就是哈希一样存一列。...通过hashCode方法equals方法来保证元素唯一性,add()返回boolean类型 判断两个元素是否相同,先要判断元素hashCode值是否一致,只有在该值一致情况下,才会判断equals...此时就需要进行次要条件判断(需要判断姓名),只有姓名年龄同时相等才可以返回0.) 通过return 0来判断唯一性。 问题:为什么使用TreeSet存入字符串,字符串默认输出按升序排列?

    38110

    全网最佳Set集合详解:HashSet、TreeSet

    Set集合1.1 HashSet面试官:你说说对HashSet理解?Set集合区别于其他三大集合重要特性就是元素具有唯一性,南友们记不住这个特性的话,有个易记方法。Set集合为什么要叫Set?...而put方法添加KeyHashSet值,Val则是一个空Object对象。PRESENT这么定义。...}HashSetcontains方法同样调用HashMap判断Key是否存在方法:containsKey。...轮到你了,TreeSet。我们南友们很好奇为什么他叫TreeSet?因为他基于TreeMap实现。。。...源码解释告诉我们,TreeSetHashSet、LinkedHashSet不同特性在于,元素既不像HashSet一样无序,不是像LinkedHashSet一样是以插入顺序来排序,它是根据元素自然顺序来进行排序

    1641210

    Java集合--Set(基础)

    本篇,让我们继续学习,来了解下Set集合; Set继承于Collection接口,一个不允许出现重复元素,并且无序集合,主要有HashSetTreeSet两大实现类。...但与List不同,Set还提供了equals(Object o)hashCode(),供其子类重写,以实现对集合中插入重复元素处理; public interface Set extends...个元素; 第三个Set集合中,只new了一个对象,调用两次add方法都添加这个新new对象,所以只是保留了1个元素; 1.5 TreeSet 从名字上可以看出,此集合实现树结构有关。...(123456)自定义排序两类,默认自然排序;在程序中,我们可以按照任意顺序将元素插入到集合中,等到遍历时TreeSet按照一定顺序输出--倒序或者升序; 它继承AbstractSet,实现NavigableSet...TreeSet元素排序 在前面的章节,我们讲到了TreeSet一个有序集合,可以对集合元素排序,其中分为自然排序自定义排序,那么这两种方式如何实现

    1.7K70

    java容器类—概述

    4、Set接口 Set一种不包括反复元素Collection,即随意两个元素e1e2都有e1.equals(e2)=false,Set最多有一个null元素。...假设一个Set中可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 Set推断两个对象同样不是使用==运算符,而是依据equals方法。也就是说。...基本特点:里面不能存放反复元素,并且採用散列存储方法,所以没有顺序。 这里所说没有顺序指:元素插入顺序与输出顺序不一致。...4.3 TreeSetTreeSetSortedSet接口唯一实现类。TreeSet能够确保集合元素处于排序状态。...TreeSet推断两个对象不相等方式两个对象通过equals方法返回false,或者通过CompareTo方法比較没有返回0 自然排序: 自然排序使用要排序元素CompareTo(Object

    58010

    java基础第十三篇之Collection

    LinkedHashSet有序 * * contains方法add方法原理 * * 1.如果ArrayList存储自定义元素 ,那么这个自定义类型 只要重写...TreeSet判断两个对象不相等方式两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0。向TreeSet中添加应该是同一个类对象,且最好不可变对象。...Java静态代码块、构造代码块、构造方法执行顺序 执行顺序 静态代码优先于非静态代码,是因为被static修饰成员都是类成员,随着JVM加载类时候加载而执行,而没有被static修饰成员被称为实例成员...super语句,则调用相应父类构造方法, 3)构造方法体第一行既不是this语句不是super语句,则隐式调用super(),即其父类默认构造方法,这也是为什么一个父类通常要提供默认构造方法原因...最后就一致 3.父类静态方法,子类必须通过静态方法进行重写. 其实这个算不算方法重写,但是现象确实如此,至于为什么算不上方法重写 子类重写父类方法,最好声明一摸一样.

    54910

    Effective Java 2.0_中英文对照_Item 8

    什么时候重写Object.equals方法合适?如果类具有逻辑等概念,不同于对象同一性,并且超类没有重写equals方法来实现要求行为,这时候就需要重写equals方法。...一致性:对于任何非空引用值xy,x.equals(y)多次调用一致返回true或一致返回false,假设对象进行equals比较时没有修改任何信息。...这时list.contains(s)返回什么?谁知道?在Sun当前实现中,它碰巧会返回false,但那仅是一种实现方案。在另一种实现中,它也可能很容易返回true或抛出一个运行时异常。...如果没有这些属性,弄清楚为什么没有,对应修改equals方法。当然你equals方法必须满足其它两个属性(自反性“非空性”),但这两个属性通常会自动满足。...这个问题在于这个方法没有重写Object.equals方法,Object.equals方法参数类型Object,但相反,它重载了equals方法(Item 41)。

    50240

    Java一分钟之-集合框架进阶:Set接口与HashSet

    在Java集合框架中,Set接口另一种重要集合类型,它不允许元素重复,并且元素顺序不确定。HashSetSet接口一个实现,它使用哈希表来存储元素,提供了快速添加、删除查找操作。...Set接口没有定义特定元素顺序,但某些实现类(如TreeSet根据元素自然排序或比较器来决定顺序。 核心方法 add(E element): 添加元素,如果集合中已存在该元素,则不会添加。...remove(Object o): 删除指定元素,如果存在。 contains(Object o): 判断集合是否包含指定元素。 isEmpty(): 判断集合是否为空。...HashSet不允许元素重复,这意味着如果尝试添加已存在元素,add方法将返回false。 特性 快速添加:通过哈希函数快速定位元素,添加效率高。...非唯一性 问题:元素hashCode()方法返回相同值,即使equals()返回false可能导致元素被视为重复。

    17410
    领券