目录
3.1.1 已经实现了Comparable接口的类(例如下面的String类)
3.2.3 正确的调用compare方法(需要三个对象(引用))
1 同一性比较
对象的引用使用 == 比较的是同一性,即地址是否相同
1)引用1 == 引用2,表示两个引用指向同一个对象
2)特例,引用1 == 引用2 == null 表示两个引用不指向任何对象
2 相等性比较
使用equals方法进行比较,前提是该对象类重写了equals方法,否则会调Object的equals方法还是比较的同一性
例如String类的比较,str1.equals(str2),如果返回值为true表示两种内容相等(str1 == str2 是一种特殊的相等性情况)
3 需要比较对象之间的大小关系
Java语言有一个规范,要求类实现Comparable或Comparator接口,接口继承Comparable或Comparator接口才具备可比较的能力。
3.1 Comparable接口比较(两个对象)
3.1.1 已经实现了Comparable接口的类(例如下面的String类)
至于下面的compareTo方法返回值是什么,代表什么含义,读者请自行查看方法源码
3.1.2 自己定义类并实现Comparable接口
定义一个Class类实现Comparable接口具备了比较能力,并且正确的重写了compareTo方法,其中泛型中的Person表示compareTo方法传入的对象时Person类。
我们自定义的比较大小的规则为:哪个Person类的level属性值大就代表哪个对象大
3.1.3 正确的重写compareTo方法
3.1.4 小结
3.2 Comparator接口(比较器)比较(三个对象)
3.2.1 使用要求
要比较的两个对象是同一个类
3.2.2 compare方法的重写
用到第三个类去实现Comparator接口并重写compare方法
3.2.3 正确的调用compare方法(需要三个对象(引用))
4 Comparator的使用场景
1) 要比较的两个对象类,不具备自然顺序,即没实现Comparable接口
2) 要比较的两个对象具备自然顺序,但这个顺序不符合我们的比较要求
以下给出第二种情况的例子
如下例我们想要的结果是甲 < 乙,但是String类虽然实现了Comparable接口(有了自然顺序),但是不符合我们的比较要求
因此我们定义一个额外的类去实现Comparator接口