admin管理员组

文章数量:1565349

JavaSE

文章目录

  • 基本类型的比较
    • 使用 ==
  • 对象的比较
    • 使用 == (不能正确比较)
    • 使用 equals()
    • 使用 comparable接口
    • 使用 comparator比较器

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

基本类型的比较

对于基本类型: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);         //falseSystem.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;}@Overridepublic 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;}@Overridepublic 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>{@Overridepublic 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(myComparatorpare(s1,s2));System.out.println(myComparatorpare(s1,s3));}
}

注:

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

本文标签: JavaSE