JAVA引用类型比较与基本类型比较

基本数据类型比较

在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()方法是不够的。
可以借用以下两种方法来实现对对象进> < =的比较操作。

  1. 实现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
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值