文章目录
前言
一 .Comparable
1.Comparable是什么?
2.comparable有用吗? 有用的话它有什么用?
没学compar之前的解决办法 :
2.在学习了comparable之后
二.comparator
1.comparator是什么?
2.comparator怎么用?
3.两者的差异
总结
前言
在这里给大家整理了一下comparable和comparator的用法和区别,这些在以后代码和面试中可能也会出现,那么,就跟着我一起去看看吧!
一 .Comparable
1.Comparable是什么?
public interface Comparable<T>
comparable是个接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过 Collections.sort
(和 Arrays.sort
)进行自动排序
2.comparable有用吗? 有用的话它有什么用?
应用场景: 要求对学生按照年龄大小进行排序
基础代码
public class Student { String name; 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("兽宝一号",23); Student s2 = new Student("兽宝二号",10); Student s3 = new Student("兽宝三号",18); Student s4 = new Student("兽宝四号",35); } }
没学compar之前的解决办法 :
遍历得到每个对象的年龄,存入整形数组,再进行排序
这里给出最后的排序和打印的代码,数组也是随便创的,大家有兴趣的话可以自己去遍历一下,
很简单的....
行吧好人做到底
下面只给图,不会给代码,有能力写的不需要代码,没能力的更需要多练!
如果你有集合的知识,遍历会更加简单,这里给出另一种方式,数组
结果
以上代码如果看不懂的话,建议看看博主其他的文章,打一下基础再来,上面的设计的知识点一言两语说不清楚,在此不会展开来进行详解,望宝子们见谅啊!实在是一锅炖不下啊!
2.在学习了comparable之后
实Comparable接口,重写抽象方法compareTo
先给大家看一下结果,别眨眼哦
compareTo方法
代码
public class Student implements Comparable<Student>{ String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Student student) { return this.age - student.age; } }public class Test2 { public static void main(String[] args) { // 年龄给出无序 Student s1 = new Student("兽宝一号",23); Student s2 = new Student("兽宝二号",10); Student s3 = new Student("兽宝三号",18); Student s4 = new Student("兽宝四号",35); // 这里用集合来讲,如果又不会的,直接用上面的代码也没问题 ArrayList<Student> al = new ArrayList<>(); //Collections 集合工具类 在这里调用了添加方法 Collections.addAll(al,s1,s2,s3,s4); for (int i = 0; i < al.size(); i++) { Student stu = al.get(i); System.out.println("name = "+stu.name+" age = "+stu.age); } } }
二. comparator
1.comparator是什么?
官方解释
Comparator可以认为是是一个比较器,本质上和Comparable相同,都是用来比较的
2.comparator怎么用?
废话不多说了,直接上图
第一种用到了匿名内部类,第二种比较简单,我们先挑软柿子捏!
由于第二种方法也需要实现接口,为了不和上面起冲突,我们就再定义一个Animal类吧
优化方法体
下面我们来看看匿名内部类的方式调用compare
如果你对匿名内部类不熟练,那么请看博主前面的文章,相信会帮到你的
3.两者的差异
1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法
2、实现Comparable接口的方式比实现Comparator接口的耦合性要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator接口的方式后面会写到就是一种典型的策略模式。
总结
以上就是本篇讲的主要内容了,如果可以的话,大家尽量把代码敲一下,脑子会了不代表手会了文章来源:https://www.toymoban.com/news/detail-454263.html
文章来源地址https://www.toymoban.com/news/detail-454263.html
到了这里,关于Comparable和Comparator的用法和区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!