逻辑上分为两类:
1.简单:等于和不等于
2.复杂:大于,小于,等于
java中:
基本类型的比较:
1)数值类型(byte/short/char/int/long/float/double):相等/不等 小于/等于/大于 (< / == / >)
2)布尔类型(boolean) 相等/不等 (== / !=)
引用类型的比较:
同一性(是否指向同一个对象)
相等性(指向的两个对象是否意义相等)
eg:丢了从图书馆借的书:如果再买一本,允许归还:图书馆只在乎相等性,不在乎同一性
如果必须找回来才能归还:图书馆在乎同一性
利用 == 和!= 比较两个引用类型的话,比较的是同一性
eg:引用1 == 引用2 为true :引用1 和 引用2 指向同一个对象(特例:引用1 == 引用2 == null;两个引用不指向任何对象)
利用 equals 比较两个引用类型的话,比较的是相等性
eg:引用1.equals(引用2) == true :引用1 指向的对象和 引用2 指向的对象是“相等” 的(前提是对象的类正确重写了 equals方法)
如果要比较两个引用类型的具体大小(小于/等于/大于):使用 Comparable 接口中的 compareTo()方法进行比较或者使用Comparator 接口中的 compare() 方法进行比较。
1.java.long.Comparable<T> 接口
逻辑含义:具备比较的能力
compareTo() 方法:this 和 o 这两个对象进行比较
若返回负数 -----> this 小于 o
若返回0 --------> this 等于 o
若返回正数--------> this 大于 o
eg: class Person implements Comparable<Person>{
@Override
public int compareTo(Person o){.....} //遵守规范
}
Person p1 = ...;
Person p2 = ...;
int cmp = p1.compareTo(p2) //this : p1 o:p2
cmp < 0; p1 小于 p2
cmp == 0; p1 等于 p2
cmp > 0; p1大于 P2
使用角度:
1.定义类的角度:正确重写 comparTo 方法
2.使用已经实现了 Comparable 接口的类的对象进行比较时
补充:
什么叫做一个正确 compareTo 方法的重写:
1.遵守 Comparable 的规则:this 小于 o :返回负数; this 等于 o: 返回零;this 大于 o : 返回正数
2.遵守我们习惯的数学规律:
1)自反性:比如 a.compareTo(b) < 0 那么 b.compareTo(a) > 0 (a 小于 b 时,b 就应该大于 a)
2) 传递性:比如 a.compareTo(b) < 0 && b.compareTo(c) < 0 则可推出 a.compaerTo(c) < 0
3.遵守和 equals 方法的统一
a.compareTo(b) == 0 ==> a.equals(b) == true
a.compareTo(b) != 0 ==> a.equals(b) == false
2.java.util.Comparator<T>接口
Comparator (用于比较东西的比较器)
要比较 o1 和 o2
o1 小于 o2 : 返回负数
o1 等于 o2 : 返回零
o1 大于 o2 : 返回正数
使用场景:
1.要比较的两个对象的类,不具备自然顺序 (没有实现过 Comparable 接口)
2.要比较的两个对象的类具备自然顺序,但是它的自然顺序不符合我们的预期