对象的比较(下)
创始人
2024-04-07 23:10:15

作者:~小明学编程  

文章专栏:Java数据结构

格言:目之所及皆为回忆,心之所想皆为过往

目录

比较器的比较

equals的比较

三种方式的比较


比较器的比较

class Card {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic String toString() {return "Card{" +"rank=" + rank +", suit='" + suit + '\'' +'}';}
}
class RankComparator implements Comparator {@Overridepublic int compare(Card o1,Card o2) {return o1.rank - o2.rank;}
}public class Test {public static void main(String[] args) {Card card1 = new Card(2,"♠");Card card2 = new Card(3,"♠");RankComparator rankComparator = new RankComparator();rankComparator.compare(card1,card2);}
}

比较器的用法就如上述的代码所示,我们首先构造一个类然后实现我们的Comparator的接口,接着就是重写我们里面的compare方法,然后就可以用它进行比较了。

当然我们在使用优先级队列的时候可以直接向里面传入我们的比较器。

public static void main(String[] args) {//默认是一个小堆RankComparator rankComparator = new RankComparator();PriorityQueue priorityQueue = new PriorityQueue<>(rankComparator);
}

当然这样写可能会觉得麻烦,因为我们首先要写一个类,然后还要我们的类来实现接口然后重写方法,那么有没有简单点的写法呢?

 public static void main(String[] args) {//默认是一个小堆PriorityQueue priorityQueue2 = new PriorityQueue<>(new Comparator() {@Overridepublic int compare(Card o1, Card o2) {return o1.rank - o2.rank;}});
}

我们可以运用内部类的写法,就是在我们new一个接口的时候就直接重写我们的compare方法。

PriorityQueue priorityQueue1 = new PriorityQueue<>((x,y)-> {return x.rank - y.rank;});

当然,还有更加简单的写法,lambda的写法,不过这种写法过于的抽象不建议用。

equals的比较

public static void main(String[] args) {Card card1 = new Card(3,"♠");Card card2 = new Card(3,"♠");System.out.println(card1.equals(card2));
}

结果意料之外情理之中,咋一看我们的两个对象的数字和花色都一样,但是为什么会返回一个false呢?我们点开源码看一下就知道了。

    public boolean equals(Object obj) {return (this == obj);}

这里equals比较的是一个地址,我们两个对象的地址不一样所以就是false,这时候我们重写一下我们的equals()方法。

    @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Card card = (Card) o;return rank == card.rank && Objects.equals(suit, card.suit);}

简单解析一下源码,首先是比较我们的地址地址一样的话,那么直接返回true,接着就是判断类型,类型不一样直接返回false,最后就是判断花色和数字,返回我们能的结果。

三种方式的比较

覆写的方法说明
Object.equals因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与
Comparable.compareTo需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于
内部顺序
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...