JavaSE---元素的比较


在我们平时进行各种比较的时候,会发现有很多种的比较方法。但是某些比较的方法在某种场景下适用,但是在某种场景下就不适用了。为了解决大家的这个烦恼,今天就来盘点一下:用于比较的所有方法及应用场景。

基本类型的比较

对于基本类型:byte、short、int、long、float、double、char、boolean;它们存储的一般都是确定的值。我们使用“==”就可以直接进行比较。

使用 ==

		int a = 10;
        int b = 20;
        System.out.println(a > b);
        System.out.println(a < b);
        System.out.println(a == b);

        char c1 = 'A';
        char c2 = 'B';
        System.out.println(c1 > c2);
        System.out.println(c1 < c2);
        System.out.println(c1 == c2);

        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b1 == b2);
        System.out.println(b1 != b2);

对象的比较

对象都是一些引用类型,通常都是我们自定义的一些类。我们就有不同的方法来进行比较。

使用 == (不能正确比较)

class Student{
    public String name;
    public int age;

    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",20);
        Student s2 = new Student("李四",21);
        Student s3 = s1;

        System.out.println(s1>s2);          //编译报错  引用类型不能用< >进行比较
        System.out.println(s1==s2);         //false
        System.out.println(s1==s3);         //true
    }
}

为什么使用“==”看起来还可以进行比较呢?

因为现在“==”比较的不是值,而是地址!
我们自己实现的类都会默认的继承Object类,在Object类中提供了equals()方法进行对象的比较。equals()方法需要我们根据实际需求自己设计比较的规则。但是,现在我们并没有手动使用equals()进行比较,而是使用了“==”,它自己就会调用Object类默认的equals()方法进行比较。默认情况下不是比较对象的内容,而是比较对象的地址是否相同。

使用 equals()

我们根据自己的需求重写equals()方法,比如:如果学生年龄相同且姓名相同,比较结果就相同。

class Student{
    public String name;
    public int age;

    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        //自己和自己比较   比较结果:相同
        if (this == o){
            return true;
        }
        //判断类型,若比较的类型不同  比较结果:不同
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        //类型相同,根据自己的逻辑进行判断
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }


}

一个问题:使用equals()方法进行比较,返回值是一个boolean值。只能判断是否相同,不能判断大小关系。

使用 comparable接口

实现Comparable接口,重写compareTo()方法。既可以进行正确的比较,又可以比较出大小关系。比如:根据学生年龄,判断相同、大小关系。

class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
}

注:

  1. 只能进行相同对象的比较。
  2. 适用于一个类的比较规则比较一定,只通过一个属性来进行比较。
  3. 比较规则放在每个类里面,比较固定,修改麻烦。

使用 comparator比较器

用户自定义比较器,实现Comparator接口。既可以进行正确的比较,又可以比较出大小关系。比如:根据学生年龄,判断相同、大小关系。

class Student {
    public String name;
    public int age;

    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

}

class MyComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三",20);
        Student s2 = new Student("李四",21);
        Student s3 = s1;
        
        MyComparator myComparator = new MyComparator();
        System.out.println(myComparator.compare(s1,s2));
        System.out.println(myComparator.compare(s1,s3));
    }
}

注:

  1. 只能进行相同对象的比较。
  2. 适用于一个类的比较规则比较多,需要使用多个属性来进行比较。可以根据每个属性都写一个比较器制定比较规则。
  3. 比较规则放在每个类外面,比较灵活,修改方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值