Java Comparable及Comparator接口区别详解
在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的。所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系。
一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接口和Comparator接口。首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入需要比较大小的另一个对象,通过选定的成员变量与之比较,如果大于则返回1,小于返回-1,相等返回0。
一般简单的回答可以这么说:
1)首先这两个接口一般都是用来实现集合内的排序,comparable还可以用于两个对象大小的比较。
2)Comparable接口在java.lang包下面。里面有一个compareTo(T)接口方法。当一个类需要比较的时候,需自行实现Comparable接口的CompareTo方法。当调用集合排序方法的时候,就会调用对象的compareTo()方法来实现对象的比较。
3)Comparator接口在java.util包下面。Comparator是一个比较器接口,一般单独定义一个比较器实现该接口中的比较方法compare();在集合sort方法中传入对应的比较器实现类。一般使用匿名内部类来实现比较器。
4)Comparator相对于Comparable来说更加的灵活,耦合度低。
首先呢,我们可以先了解一下List是如何排序的,我通过写一个例子来说明;
先写一个实体类;
public class User { private String name; private Integer age; public static void main(String[] args) { List<User> users=new ArrayList<>(); users.add(new User("yao",19)); users.add(new User("zhang",20)); users.add(new User("li",17)); users.add(new User("xu",15)); users.add(new User("xupeng",15)); users.sort(new UserComparator()); System.out.println(users); } public User(){ } public User(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
再写一个实现比较器接口的类方法;
/** * 实现比较器接口,并重写compare方法 */ public class UserComparator implements Comparator<User> { @Override public int compare(User o1, User o2) { int age=o1.getAge()- o2.getAge(); return age!=0?age:o1.getName().length()-o2.getName().length(); } }
最后,我们的测试结果是这样的,说明成功了;
一、Comparable接口
1)什么是Comparable接口:
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。
2)实现什么方法:
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
3)实例(注:代码基本上只改动我圈出来的即可测试,其它的照List排序的元代码使用即可测试出结果):
当前对象 this与传入的其他对应的比较方法时;
二、Comparator接口
1)实例说明:
Comparator接口与Comparable接口不同的是:
①Comparator位于包java.util下,而Comparable位于包java.lang下。
②Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。
③comparator接口相对更灵活些,因为它跟接口实现的类是耦合在一起的,可以通过换比较器来换不同的规则进行比较,即如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可
以通过Comparator接口来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
④Comparable接口强制进行自然排序,而Comparator接口不强制进行自然排序,可以指定排序顺序。
⑤换一种说法,简单的说:
Comparable:使user类具有自比较的能力,可以让自己跟同类型的数据做比较;
Comparator:就是一个比较器,像一个第三方,传入两个对象,让比较器去判断谁大谁小;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Java中File、Base64、MultipartFile之间相互转换的代码详解
File、Base64和MultipartFile都是在编程中常用的类或者数据类型,用于处理文件和数据的存储、传输和转换等操作,本文将给大家介绍了Java中File、Base64、MultipartFile之间相互转换,文中有详细的代码示例供大家参考,需要的朋友可以参考下2024-04-04详解Spring cloud使用Ribbon进行Restful请求
这篇文章主要介绍了详解Spring cloud使用Ribbon进行Restful请求,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-04-04
最新评论