阅读之前看这里👉:博主是一名与大家共同学习的学生,博客记录的是在学习过程中一些总结,也希望和大家一起进步,在记录之时,未免存在很多疏漏和不全,如有问题,还请私聊博主指正。
博客地址:天阑之蓝的博客,学习过程中不免有困难和迷茫,希望大家都能在这学习的过程中肯定自己,超越自己,最终创造自己。
1.Comparable定义
Interface Comparable<T>
参数类型 : T—该对象可以与之进行比较的对象的类型 。
- 此接口对实现该接口的每个类的对象强加了总体排序。 该排序称为类的自然排序 ,而该类的compareTo方法被称为其自然比较方法 。
- 可以通过Collections.sort (和Arrays.sort )自动对实现此接口的对象的列表(和数组)进行排序。实现该接口的对象,可以使用如在键sorted map或作为在元件sorted set ,而不需要指定一个comparator 。
- 当且仅当 e1.compareTo(e2) == 0 ,对于类 C 的每个 e1 和 e2 具有与 e1.equals(e2) 相同的布尔值时,才说类 C 的自然顺序与 equals 一致。请注意, null 不是任何类的实例,即 e.equals(null) 返回 false,e.compareTo(null) 也应该抛出 NullPointerException。
- 强烈建议(虽然不是必需的)自然顺序与 equals 一致。之所以如此,是因为没有显式比较器的排序集(和排序映射)在与自然顺序与 equals 不一致的元素(或键)一起使用时表现得“奇怪”。特别是,这样的排序集合(或排序映射)违反了集合(或映射)的一般契约,它是根据 equals 方法定义的。
-
例如,如果将两个键 a 和 b 相加使得 (!a.equals(b) && a.compareTo(b) == 0)到一个不使用显式比较器的有序集合,则第二个加法操作返回 false (并且排序集的大小不会增加)因为从排序集的角度来看 a 和 b
是等效的。 - 几乎所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然顺序。一个例外是java.math.BigDecimal,它的自然排序将 BigDecimal 对象等同于具有相同的值和不同的精度(例如 4.0 和4.00)。
- 数学上定义给定类 C 的自然排序的关系是:
{(x, y) such that x.compareTo(y) <= 0}
- 此总顺序的商为:
{(x, y) such that x.compareTo(y) == 0}.
- 从compareTo 的定义可以立即得出该商数是一个等价关系 C ,并且自然排序是C 上的全序。当我们说一个类的自然排序与equals一致时,意思是自然排序是由类的 equals(Object) 方法定义的等价关系:
{(x, y) such that x.equals(y)}
.。
2.Comparable的实例学习
说明:TreeSet调用集合元素的compareTo方法来比较元素的大小关系,然后将集合元素按照升序排列(从小到大,BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short 是按数字大小排序。Character 按字符的Unicode值的数字大小排序。String 按字符串中字符的Unicode值排序)。
要求TreeSet集合中的元素实现Comparable接口。在compareTo方法中编写