java中对象的比较(三种方式)

本文介绍了如何在Java中避免在优先级队列插入自定义对象时出现类型转换异常,关键在于自定义对象需实现Comparable接口或Comparator接口以定义比较规则,确保元素能正确排序并构建堆结构。
摘要由CSDN通过智能技术生成

‘}’;

}

}

public class TestDemo {

public static void main(String[] args) {

Card card1 = new Card(1, “♦”);

Card card2 = new Card(1, “♦”);

Card card3 = new Card(3, “♦”);

//创建一个优先级队列

Queue qu = new PriorityQueue<>();

//先向这个优先级队列中插入一个元素

qu.offer(card1);

qu.offer(card2);

System.out.println(qu);

}

}

此时我们会发现出现了类型转换异常(ClassCastException):这是为什么呢?

在这里插入图片描述

此时我们点开我们报错的代码:

在这里插入图片描述

然后找到了对应的报错语句:

在这里插入图片描述

此处我们发现其强行将x转换成了Comparable类型,换到我们上面的代码中去相当于x就是我们的Card,而Card这个类型要是想实现类型转换至少应该继承我们的Comparable接口,并且还有一个问题,之前我们在讲优先级队列的时候提到过,我们每个元素再插入的时候都会调整成小根堆,调整成为小根堆的过程其实就是比较大小的过程,之前我们所有的代码插入的是对象是整数,整数非常容易比较大小,但是这次我们插入的是自定义对象,就拿我们card举例,当我们插入第二个自定义对象的时候,我们是比较花色还是比较牌的数字的大小,这个并没有告诉我们怎么比,所以最终当我们的优先级队列查看到第二个插入的元素的时候,需要构建小根堆,但是并没有告诉我们比较插入进来的对象的方式,最终导致了类型转换一吃昂,所以此时我们应该让Card类去实现我们的Comparable接口,并告诉我们比较的方式是什么.

并且大家要注意了:为什么我们之前插入一个整数的时候人家就自动每插入一个元素就可以自动比较大小并且建大/小堆呢?我们来看

在这里插入图片描述

我们摁住Ctrl进入到Integer的源码中:

在这里插入图片描述

此时我们会发现人家Integer早已经实现了Comparable接口

解析


此处我们提供两种方法来告诉我们比较的方式是什么:

1:Comparable接口

2:Comparator接口

Comparable接口

按照rank的值进行比较
底层为小根堆

下面我们来给出在优先级队列中插入一个自定义对象时为了防止类型转换异常的正确比较方式:

先来看我们的代码:

class Card implements Comparable {

public int rank; // 数值

public String suit; // 花色

public Card(int rank, String suit) {

this.rank = rank;

this.suit = suit;

}

@Override

public String toString() {

return “Card{” +

“rank=” + rank +

“, suit='” + suit + ‘’’ +

‘}’;

}

@Override

public int compare

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值