在Java集合框架中有两种比较接口: Comparable 接口和 Comparator 接口。
一、Comparable 接口 
public interface Comparable<T> {
public int compareTo(T o);
}

  一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果数组或者集合中的(类)元素实现了该接口的话 , 我们就可以调用 Collections.sort 和 Arrays.sort 排序,或应用于有序集合 TreeSet 和 TreeMap 中。

public class Test {

    public static void main(String[] args) {
Person[] persons = {
new Person(10, "P1"), new Person(35, "P2"),
new Person(60, "P3"), new Person(10, "P4"),
new Person(40, "P5"), new Person(10, "P6") }; Person[] persons2 = persons;
Person[] persons3 = persons;
System.out.println("Before Sort:" + Arrays.toString(persons)); Arrays.sort(persons);
System.out.println("Arrays.sort:" + Arrays.toString(persons)); Collections.sort(Arrays.asList(persons2));
System.out.println("Collections.sort:" + Arrays.toString(persons2)); TreeSet<Person> set = new TreeSet<Person>();
TreeMap<Person, String> map = new TreeMap<Person, String>();
for(int i = 0; i < persons3.length; i++) {
set.add(persons3[i]);
map.put(persons3[i], "P" + (i + 1));
}
System.out.println("TreeSet:" + Arrays.toString(persons2));
System.out.println("TreeMap:" + Arrays.toString(persons2));
}
} class Person implements Comparable<Person>{ private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
} public int compareTo(Person person) {
int cop = age - person.getAge();
return cop != 0 ? cop : name.compareTo(person.getName());
}
// 一般来说,一个类如果涉及到比较,应该重写equals()方法,因为内存地址比较没有意义。
public boolean equals(Object o) {
if(!(o instanceof Person))
return false;
Person person = (Person) o;
return (age == person.getAge()) && (name.equals(person.getName()));
}
// 覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个哈希码。
public int hashcode() {
int result = 17;
result = 37 * result + age;
result = 37 * result + name.hashCode();
return result;
} public String toString() {
return age + "-" + name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}

运行结果

  Before Sort:[10-P1, 35-P2, 60-P3, 10-P4, 40-P5, 10-P6]
  Arrays.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
Collections.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
     TreeSet:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
    TreeMap:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]

二、 Comparator 接口

public interface Comparator<T> {
int compare(T o1, T o2);
}

  Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。Comparator的应用场景:

  1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序;
  2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
public class Test {

    public static void main(String[] args) {
Person[] persons = {
new Person(10, "P1"), new Person(35, "P2"),
new Person(60, "P3"), new Person(10, "P4"),
new Person(40, "P5"), new Person(10, "P6") }; Person[] persons2 = persons;
System.out.println("Before Sort:" + Arrays.toString(persons)); Arrays.sort(persons, new PersonComparator());
System.out.println("Arrays.sort:" + Arrays.toString(persons)); Collections.sort(Arrays.asList(persons2), new PersonComparator());
System.out.println("Collections.sort:" + Arrays.toString(persons2));
}
} class PersonComparator implements Comparator<Person> { @Override
public int compare(Person p1, Person p2) {
int cop = p1.getAge() - p2.getAge();
return cop != 0 ? cop : p1.getName().compareTo(p2.getName());
}
}

运行结果

Before Sort:[10-P1, 35-P2, 60-P3, 10-P4, 40-P5, 10-P6]
  Arrays.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]
Collections.sort:[10-P1, 10-P4, 10-P6, 35-P2, 40-P5, 60-P3]

Java Compare接口的更多相关文章

  1. 比较器:Compare接口与Comparator接口区别与理解

    一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...

  2. Java compare方法和compareTo方法

    Java Comparator接口排序用法,详细介绍可以阅读这个链接的内容:https://www.cnblogs.com/shizhijie/p/7657049.html 对于 public int ...

  3. Java 函数式接口

    目录 Java 函数式接口 1. 函数式接口 1.1 概念 1.2 格式 1.3 函数式接口的使用 2. 函数式编程 2.1 Lambda的延迟执行 性能浪费的日志案例 使用Lambda表达式的优化 ...

  4. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  5. 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  6. java微信接口之五—消息分组群发

    一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...

  7. java微信接口之四—上传素材

    一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...

  8. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  9. [转载]深入理解JAVA的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

随机推荐

  1. powerdesigner自动将name填充到注释的脚本

    我在建模的时候,希望在生成脚本的时候有注释,所以才会看到Comment列,实际上,只要你的表中的Name列不为空,运行下面的VBScript,PD会帮你自动填充注释的Comment列值. '把pd中那 ...

  2. JS 中的数组遍历方式效率比较

    JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代码如下: ; j < ...

  3. DOM 操作属性

    DOM操作就是针对对象的操作 先写一个按钮,<input tupe="button" value=""  id="id">  这 ...

  4. JavaPersistenceWithHibernate第二版笔记-第七章-003Mapping an identifier bag(@OrderColumn、@ElementCollection、@CollectionTable、、)

    一.结构 二.代码 1. package org.jpwh.model.collections.listofstrings; import org.jpwh.model.Constants; impo ...

  5. Linux 性能调优

    一.简介 有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等.为了更好的优化程序性能,我们必须找到性能瓶颈点,"好钢用在刀刃上"才能取得好的效果,否则可能白做工 ...

  6. Luogu 4001 [BJOI2006]狼抓兔子

    BZOJ 1001…… 并不会这个trick,所以笔记要详细一点. 前置知识 : 平面图转对偶图    传送门 听说直接$Dinic$就好了,还跑得比正解快…… 首先我们按照平面图的定义,把网格图中所 ...

  7. Entity Framework Tutorial Basics(36):Eager Loading

    Eager Loading: Eager loading is the process whereby a query for one type of entity also loads relate ...

  8. Proxool Provider unable to load JAXP configurator file: proxoolconf.xml

    Proxool Provider unable to load JAXP configurator file: proxoolconf.xml log4j:WARN No appenders coul ...

  9. Umbraco中如何找到home node

    在一个Umbraco项目中,我们经常会出现需要找到这个项目的home node的情况, 那么如何来找到项目的home node呢 方法如下: 1. 在View中 @inherits Umbraco.W ...

  10. idea中解决Error:java: Compilation failed: internal java compiler error的问题

    项目中,使用gradle做项目构建,当我们想更改JDK的版本时,报以下错误: Information:Using javac 1.8.0_111 to compile java sourcesInfo ...