宁波网站免费建设服务平台,奥派电子商务网站建设论文,北京小程序设计制作,有个做名片什么的网站详解Java中Comparable和Comparator接口的区别发布于 2020-7-20|复制链接摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别#xff0c;两者都有比较的功能#xff0c;那么究竟有什么区别呢#xff0c;感兴趣的J…详解Java中Comparable和Comparator接口的区别发布于 2020-7-20|复制链接摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别两者都有比较的功能那么究竟有什么区别呢感兴趣的Java开发者继续看下去吧。Comparable 简介 ..详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别两者都有比较的功能那么究竟有什么区别呢感兴趣的Java开发者继续看下去吧。Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。此外“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素而不需要指定比较器。Comparable 定义Comparable 接口仅仅只包括一个函数它的定义如下javapackage java.lang;import java.util.*;public interface Comparable {public int compareTo(T o);}说明假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”意味着“x比y小”返回“零”意味着“x等于y”返回“正数”意味着“x大于y”。Comparator 简介Comparator 是比较器接口。我们若需要控制某个类的次序而该类本身不支持排序(即没有实现Comparable接口)那么我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说我们可以通过“实现Comparator类来新建一个比较器”然后通过该比较器对类进行排序。Comparator 定义Comparator 接口仅仅只包括两个个函数它的定义如下javapackage java.util;public interface Comparator {int compare(T o1, T o2);boolean equals(Object obj);}说明(01) 若一个类要实现Comparator接口它一定要实现compareTo(T o1, T o2) 函数但可以不实现 equals(Object obj) 函数。为什么可以不实现 equals(Object obj) 函数呢 因为任何类默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object在Object.java中实现了equals(Object obj)函数所以其它所有的类也相当于都实现了该函数。(02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”意味着“o1比o2小”返回“零”意味着“o1等于o2”返回“正数”意味着“o1大于o2”。Comparator 和 Comparable 比较Comparable是排序接口若一个类实现了Comparable接口就意味着“该类支持排序”。而Comparator是比较器我们若需要控制某个类的次序可以建立一个“该类的比较器”来进行排序。我们不难发现Comparable相当于“内部比较器”而Comparator相当于“外部比较器”。我们通过一个测试程序来对这两个接口进行说明。源码如下javaimport java.util.*;import java.lang.Comparable;/*** desc Comparator和“Comparable”的比较程序。* (01) Comparable* 它是一个排序接口只包含一个函数compareTo()。* 一个类实现了Comparable接口就意味着“该类本身支持排序”它可以直接通过Arrays.sort() 或 Collections.sort()进行排序。* (02) Comparator* 它是一个比较器接口包括两个函数compare() 和 equals()。* 一个类实现了Comparator接口那么它就是一个“比较器”。其它的类可以根据该比较器去排序。** 综上所述Comparable是内部比较器而Comparator是外部比较器。* 一个类本身实现了Comparable比较器就意味着它本身支持排序若它本身没实现Comparable也可以通过外部比较器Comparator进行排序。*/public class CompareComparatorAndComparableTest{public static void main(String[] args) {// 新建ArrayList(动态数组)ArrayList list new ArrayList();// 添加对象到ArrayList中list.add(new Person(ccc, 20));list.add(new Person(AAA, 30));list.add(new Person(bbb, 10));list.add(new Person(ddd, 40));// 打印list的原始序列System.out.printf(Original sort, list:%s\n, list);// 对list进行排序// 这里会根据“Person实现的Comparable接口”进行排序即会根据“name”进行排序Collections.sort(list);System.out.printf(Name sort, list:%s\n, list);// 通过“比较器(AscAgeComparator)”对list进行排序// AscAgeComparator的排序方式是根据“age”的升序排序Collections.sort(list, new AscAgeComparator());System.out.printf(Asc(age) sort, list:%s\n, list);// 通过“比较器(DescAgeComparator)”对list进行排序// DescAgeComparator的排序方式是根据“age”的降序排序Collections.sort(list, new DescAgeComparator());System.out.printf(Desc(age) sort, list:%s\n, list);// 判断两个person是否相等testEquals();}/*** desc 测试两个Person比较是否相等。* 由于Person实现了equals()函数若两person的age、name都相等则认为这两个person相等。* 所以这里的p1和p2相等。** TODO若去掉Person中的equals()函数则p1不等于p2*/private static void testEquals() {Person p1 new Person(eee, 100);Person p2 new Person(eee, 100);if (p1.equals(p2)) {System.out.printf(%s EQUAL %s\n, p1, p2);} else {System.out.printf(%s NOT EQUAL %s\n, p1, p2);}}/*** desc Person类。* Person实现了Comparable接口这意味着Person本身支持排序*/private static class Person implements Comparable{int age;String name;public Person(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public int getAge() {return age;}public String toString() {return name - age;}/*** 比较两个Person是否相等若它们的name和age都相等则认为它们相等*/boolean equals(Person person) {if (this.age person.age this.name person.name)return true;return false;}/*** desc 实现 “Comparable” 的接口即重写compareTo函数。* 这里是通过“person的名字”进行比较的*/Overridepublic int compareTo(Person person) {return name.compareTo(person.name);//return this.name - person.name;}}/*** desc AscAgeComparator比较器* 它是“Person的age的升序比较器”*/private static class AscAgeComparator implements Comparator {Overridepublic int compare(Person p1, Person p2) {return p1.getAge() - p2.getAge();}}/*** desc DescAgeComparator比较器* 它是“Person的age的升序比较器”*/private static class DescAgeComparator implements Comparator {Overridepublic int compare(Person p1, Person p2) {return p2.getAge() - p1.getAge();}}}下面对这个程序进行说明。a) Person类定义。如下javaprivate static class Person implements Comparable{int age;String name;.../*** desc 实现 “Comparable” 的接口即重写compareTo函数。* 这里是通过“person的名字”进行比较的*/Overridepublic int compareTo(Person person) {return name.compareTo(person.name);//return this.name - person.name;}}说明(01) Person类代表一个人Persong类中有两个属性age(年纪) 和 name“人名”。(02) Person类实现了Comparable接口因此它能被排序。b) 在main()中我们创建了Person的List数组(list)。如下java// 新建ArrayList(动态数组)ArrayList list new ArrayList();// 添加对象到ArrayList中list.add(new Person(ccc, 20));list.add(new Person(AAA, 30));list.add(new Person(bbb, 10));list.add(new Person(ddd, 40));c) 接着我们打印出list的全部元素。如下java// 打印list的原始序列System.out.printf(Original sort, list:%s\n, list);d) 然后我们通过Collections的sort()函数对list进行排序。由于Person实现了Comparable接口因此通过sort()排序时会根据Person支持的排序方式即 compareTo(Person person) 所定义的规则进行排序。如下java// 对list进行排序// 这里会根据“Person实现的Comparable接口”进行排序即会根据“name”进行排序Collections.sort(list);System.out.printf(Name sort, list:%s\n, list);e) 对比Comparable和Comparator我们定义了两个比较器 AscAgeComparator 和 DescAgeComparator来分别对Person进行 升序 和 降低 排序。e.1) AscAgeComparator比较器它是将Person按照age进行升序排序。代码如下java/*** desc AscAgeComparator比较器* 它是“Person的age的升序比较器”*/private static class AscAgeComparator implements Comparator {Overridepublic int compare(Person p1, Person p2) {return p1.getAge() - p2.getAge();}}e.2) DescAgeComparator比较器它是将Person按照age进行降序排序。代码如下java/*** desc DescAgeComparator比较器* 它是“Person的age的升序比较器”*/private static class DescAgeComparator implements Comparator {Overridepublic int compare(Person p1, Person p2) {return p2.getAge() - p1.getAge();}}f) 运行结果运行程序输出如下javaOriginal sort, list:[ccc - 20, AAA - 30, bbb - 10, ddd - 40]Name sort, list:[AAA - 30, bbb - 10, ccc - 20, ddd - 40]Asc(age) sort, list:[bbb - 10, ccc - 20, AAA - 30, ddd - 40]Desc(age) sort, list:[ddd - 40, AAA - 30, ccc - 20, bbb - 10]eee - 100 EQUAL eee - 100