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

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

73470

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.1K100
您找到你想要的搜索结果了吗?
是的
没有找到

《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

28210

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

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

10400

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存入字符串,字符串默认输出按升序排列?

35810

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存入字符串,字符串默认输出按升序排列?

41631

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存入字符串,字符串默认输出按升序排列?

48930

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

48210

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)。

47240

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

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

13210

java基础第十三篇之Collection

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

53010

JavaSE(八)集合之Set

/* 注意:这里一个Student类:里面有nameage属性。 * 为什么31?...* 1,31一个质数,质数能被1自己本身整除数 * 2,31这个数既不大不小 * 3,31这个数好算,2五次方-1,2向左移动5位 */ @Override...* 1,31一个质数,质数能被1自己本身整除数 * 2,31这个数既不大不小 * 3,31这个数好算,2五次方-1,2向左移动5位 */ @Override...这取决于使用构造方法。     TreeSet为基本操作(add、remove contains)提供受保证 log(n) 时间开销。     另外,TreeSet是非同步。...当返回-1时,张三作为二叉树根,李四和它比较时,返回-1说明,李四小,挂在张三左边。王五一进来张三比较返回-1,放在张三左边,在李四比较返回-1,挂在李四左边,以此类推。

93950
领券