基本数据类型比较
在java中,基本数据类型可以直接比大小。
在JVM中内部,已经具备这样的指令,所以可以直接比较大小。
引用类型的比较
class Card{
int rank;
String suit;
public Card(int rank,String suit){
this.rank=rank;
this.suit=suit;
}
}
public class Test{
public static void main(String[] args){
Card c1 = new Card(1, "♠");
Card c2 = new Card(2, "♠");
Card c3 = c1;
//System.out.println(c1 > c2); // 编译报错
System.out.println(c1 == c2); // 编译成功 ----> 打印false,因为c1和c2指向的是不同对象
//System.out.println(c1 < c2); // 编译报错
System.out.println(c1 == c3); // 编译成功 ----> 打印true,因为c1和c3指向的是同一 个对象
}
}
c1、c2和c3分别是Card类型的引用变量,上述代码在比较编译时:
c1 > c2 编译失败
c1== c2 编译成功
c1 < c2 编译失败
由此可见:java引用类型不能直接用>或<比较,但可以使用==比较。
这是因为每个类都默认继承了Object类,Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意。
//对Card类实现equals( )方法重写
public boolean equals(Object obj) {
// 自己和自己比较
if (this == o) {
return true;
}
// o如果是null对象,或者o不是Card的子类
if (o == null || !(o instanceof Card)) {
return false;
} /
/ 注意基本类型可以直接比较,但引用类型最好调用其equal方法
Card c = (Card)o;
return rank == c.rank
&& suit.equals(c.suit);
}
所以,要完全实现对引用类型的比较,只是有equals()方法是不够的。
可以借用以下两种方法来实现对对象进> < =的比较操作。
- 实现Comparable接口重写,在类中重写comparaTo()方法。
class Card implements Comparable<Card>{
int rank;
String suit;
public Card(int rank,String suit){
this.rank=rank;
this.suit=suit;
}
public int compareTo(Card o){
if(null == o){
return 1;
}
return this.rank-o.rank;
}
}
2.实现一个比较类,让这个类实现Comparato接口,重写compareTo()方法
class CardComparator implements Comparator<Card> {
@Override
public int compare(Card o1, Card o2) {
if (o1 == o2) {
return 0;
}
if (o1 == null) {
return -1;
}
if (o2 == null) {
return 1;
}
return o1.rank - o2.rank
}
}