ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java对象的比较,Java技术功底不够如何去面试

2021-12-20 13:06:07  阅读:159  来源: 互联网

标签:java 功底 System rank suit println Java public Card


char ch3=‘c’;

System.out.println(ch1>ch2);

System.out.println(ch1==ch2);

System.out.println(ch1<ch2);

boolean b1=true;

boolean b2=false;

System.out.println(b1==b2);

System.out.println(b1!=b2);

}

在这里插入图片描述

对于String类的比较可以参考我之前写的博客:初识java的String类

类的比较


对于类的比较如果直接像元素比较一样可能会造成编译错误或者与预期效果的不一样。

class Card{

public int rank;

public String suit;

public Card(int rank, String suit) {

this.rank = rank;

this.suit = suit;

}

}

public class Main{

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);//打印false,因为c1和c2指向的是不同对象

}

}

从此编译结果中我们可以发现,java中引用类型的变量不能直接按照> 或者< 方式进行比较,但确可以使用==符号进行比较?

原因:对于用户自己实现定义的类型,都是默认为Object类,Object类提供了equal方法,此方法的比较规则是:无比较引用变量引用对象的内容,而是直接比较引用变量的地址,因此equal方法一般在使用的时候会被重写

// Object中equal的实现,可以看到:直接比较的是两个引用变量的地址

public boolean equals(Object obj) {

return (this == obj);

}

比较方法


在一些情况下,我们需要比较的是对象的内容,而不是比较对象的地址是否相同,则需要重写比较方法。

重写equals方法

class Card{

public int rank;

public String suit;

public Card(int rank, String suit) {

this.rank = rank;

this.suit = suit;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

// o如果是null对象,或者o不是Card的子类

if (o == null || !(o instanceof Card)) return false;

Card card = (Card) o;

return rank == card.rank && Objects.equals(suit, card.suit);

}

}

Publ

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

ic class Main{

public static void main(String[] args){

Card c1 = new Card(1, “♠”);

Card c2 = new Card(1, “♠”);

System.out.println(c1.equals(c2));

}

}

其equal方法实现如下:

  1. 如果这个类指向同一个对象则直接返回true;

  2. 如果传入的为空或者其对象类型不是Card,则返回false

  3. 按照类的实现目标完成比较,这里只要花色和数值一样,就认为是相同的牌

  4. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较

基于Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

public interface Comparable{

// 返回值:

// < 0: 表示 this 指向的对象小于 o 指向的对象

// == 0: 表示 this 指向的对象等于 o 指向的对象

// > 0: 表示 this 指向的对象等于 o 指向的对象

public int compareTo(T o);

}

对于用户自定义类型,如果按照大小与方式进行比较:可以在定义类的时候实现接口Comparable,并在类中重写compareTo方法。

class Card implements Comparable{

public int rank;

public String suit;

public Card(int rank, String suit) {

this.rank = rank;

this.suit = suit;

}

@Override

public int compareTo(Card o) {

return this.rank-o.rank;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || !(o instanceof Card)) return false;

Card card = (Card) o;

return rank == card.rank && Objects.equals(suit, card.suit);

}

}

public class Main {

public static void main(String[] args) {

Card p = new Card(1, “♠”);

Card q = new Card(2, “♠”);

Card o = new Card(1, “♠”);

System.out.println(p.compareTo(o)); // == 0,表示牌相等

System.out.println(p.compareTo(q));// < 0,表示 p 比较小

System.out.println(q.compareTo§);// > 0,表示 q 比较大

}

}

在这里插入图片描述

基于比较器比较基于比较器比较:Comparator接口

按照比较器方式进行比较,具体步骤如下:

  1. 户自定义比较器类,实现Comparator接口

  2. 覆写Comparator中的compare方法

class Card{

public int rank;

public String suit;

public Card(int rank, String suit) {

this.rank = rank;

this.suit = suit;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || !(o instanceof Card)) return false;

Card card = (Card) o;

return rank == card.rank && Objects.equals(suit, card.suit);

}

}

class CardComparator implements Comparator{

@Override

// 返回值:

标签:java,功底,System,rank,suit,println,Java,public,Card
来源: https://blog.csdn.net/m0_64867152/article/details/122038976

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有