已解决
JavaSE---元素的比较
来自网友在路上 168868提问 提问时间:2023-11-02 18:06:31阅读次数: 68
最佳答案 问答题库688位专家为你答疑解惑
文章目录
- 基本类型的比较
- 使用 ==
- 对象的比较
- 使用 == (不能正确比较)
- 使用 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;}
}
注:
- 只能进行相同对象的比较。
- 适用于一个类的比较规则比较一定,只通过一个属性来进行比较。
- 比较规则放在每个类里面,比较固定,修改麻烦。
使用 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(myComparator.compare(s1,s2));System.out.println(myComparator.compare(s1,s3));}
}
注:
- 只能进行相同对象的比较。
- 适用于一个类的比较规则比较多,需要使用多个属性来进行比较。可以根据每个属性都写一个比较器制定比较规则。
- 比较规则放在每个类外面,比较灵活,修改方便。
查看全文
99%的人还看了
相似问题
- Kotlin学习——kt里的集合,Map的各种方法之String篇
- Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览
- composer切换全局镜像源的方法
- Python通过selenium调用IE11浏览器报错解决方法
- 测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发
- Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- ChatGLM2 大模型微调过程中遇到的一些坑及解决方法(更新中)
- 类方法,静态方法和实例方法的区别及应用场景
- 【链表的说明、方法---顺序表与链表的区别】
猜你感兴趣
版权申明
本文"JavaSE---元素的比较":http://eshow365.cn/6-30398-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 基于wireguard与NAT实现windows10代理服务器
- 下一篇: Vue基础与指令