逻辑上分为两类:

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> 接口

与java比较 java 比较_引用类型

 逻辑含义:具备比较的能力

与java比较 java 比较_定义类_02

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 (用于比较东西的比较器)

与java比较 java 比较_与java比较_03

 要比较 o1 和 o2 

o1 小于 o2 : 返回负数

o1 等于 o2 : 返回零

o1 大于 o2 : 返回正数


使用场景: 

1.要比较的两个对象的类,不具备自然顺序 (没有实现过 Comparable 接口)

 2.要比较的两个对象的类具备自然顺序,但是它的自然顺序不符合我们的预期