java中的比较详解

目录

1.基本类型的比较

2.引用类型的比较

2.1 两个对象是否相同

2.1.1 重写equals方法(是否相同,返回值true或false)

2.2 两个对象的大小(需要确定根据什么进行比较,如年龄,姓名等等)

2.2.1 内部实现Comparable接口

2.2.2 外部实现对应的比较器(该比较器实现Comparator接口


1.基本类型的比较

     使用比较运算符进行比较,如 > < = >= <= != == 等进行比较。

注:八大基本数据类型:byte,short,int,long,float,double,char,boolean。

2.引用类型的比较

2.1 两个对象是否相同

2.1.1 重写equals方法(是否相同,返回值true或false)

          只能判断两个对象是否相等,不能比较它们两个之间的大小。

          ● 示例代码

class Store {
    int code;
    String name;

    public Store(int code, String name) {
        this.code = code;
        this.name = name;
    }

    //重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Store store = (Store) o;
        //如果给出的两个商店的商店编号和商店名称都一样,那么就认为它们是一个商店
        return code == store.code && Objects.equals(name, store.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(code, name);
    }
}

public class CompareTest {
    public static void main(String[] args) {
        //相同名称,但不同编号
        Store s1 = new Store(1001,"好再来");
        Store s2 = new Store(1002,"好再来");
        System.out.println(s1.equals(s2));
        //相同编号,但不同名称
        Store s3 = new Store(1003,"乐尔乐");
        Store s4 = new Store(1003,"好再来");
        System.out.println(s3.equals(s4));
        //相同编号相同名称
        Store s5 = new Store(1004,"好再来");
        Store s6 = new Store(1004,"好再来");
        System.out.println(s5.equals(s6));
    }
}

          ● 运行结果测试


2.2 两个对象的大小(需要确定根据什么进行比较,如年龄,姓名等等)

2.2.1 内部实现Comparable接口

          当该对象确定以什么属性进行比较之后就固定了,无法修改,不太灵活。

          ● 示例代码

//方法二:内部实现Comparable接口(不够灵活,对本身代码入侵性强)
class Store implements Comparable<Store>{
    int code;
    String name;

    public Store(int code, String name) {
        this.code = code;
        this.name = name;
    }

    @Override
    public int compareTo(Store o) {
        return this.code - o.code;//根据编号比较,this > o 返回正整数,this < o 返回负整数,相等返回0
    }
}

public class CompareTest {
    public static void main(String[] args) {
        //根据商店编号进行大小比较
        Store s1 = new Store(1001,"好再来");
        Store s2 = new Store(1002,"乐尔乐");
        Store s3 = new Store(1002,"好再来");

        //s2调用了compareTo方法,所以this引用指向它
        System.out.println(s2.compareTo(s1)); //s2 > s1 返回正整数
        System.out.println(s2.compareTo(s3)); //s2 = s3 返回0
        //s1调用了compareTo方法,所以this引用指向它
        System.out.println(s1.compareTo(s2)); //s1 < s2 返回负整数
    }
}

          ● 运行结果测试

 

注:当商店要根据姓名进行大小比较时,那么就必须重新修改其compareTo方法,而原本根据编号进行比较的代码便无法使用,所以这种比较方式是不灵活的,且对本身代码的入侵性比较强,所以就有了第三种比较方式→外部实现一个比较器


2.2.2 外部实现对应的比较器(该比较器实现Comparator接口)

          比内部实现Comparable接口要灵活,可以不用修改本身代码。

          ● 示例代码

//方法三:外部实现对应的比较器
class Store {
    int code;
    String name;

    public Store(int code, String name) {
        this.code = code;
        this.name = name;
    }
}

//编号比较器(根据商店编号进行比较)
class CodeComparator implements Comparator<Store> {

    @Override
    public int compare(Store o1, Store o2) {
        return o1.code - o2.code;
    }
}

//姓名比较器(根据商店名称进行比较)
class NameComparator implements Comparator<Store> {

    @Override
    public int compare(Store o1, Store o2) {
        return o1.name.compareTo(o2.name);
    }
}
public class CompareTest {
    public static void main(String[] args) {
        Store s1 = new Store(1009,"乐尔乐");
        Store s2 = new Store(1005,"好再来");
        //根据商店编号进行大小比较
        CodeComparator codeComparator = new CodeComparator();
        //根据商店编号比较(s1 > s2 返回正整数)
        int codeRet = codeComparator.compare(s1,s2);
        System.out.println(codeRet);
        //根据商店名称进行大小比较
        NameComparator nameComparator = new NameComparator();
        //根据商店名称比较(s1 < s2 返回负整数)
        int nameRet = nameComparator.compare(s1,s2);
        System.out.println(nameRet);
    }
}

          ● 运行结果测试

 

注:大家可能对中文的比较有些不懂,因为这涉及到中文在Java中的存储,可以看看这篇博客

Java中如何存储汉字_caoruntao_的博客-CSDN博客_java 汉字


分享完毕~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值