### 1\. Comparable
~~~
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
~~~
说明:
Comparable 是排序接口。若一个类实现了Comparable接口,则该类可以支持排序。 假设现在存在实现Comparable接口的类的实例的List列表(或数组),则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。
举例:
~~~
package com.qunar.test;
/**
* Created by xiaosi on 16-3-7.
*/
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student stu) {
if(age == stu.getAge()){
return name.compareTo(stu.getName());
}//if
else if(age > stu.getAge()){
return 1;
}
return -1;
}
}
~~~
~~~
List<Student> stus = new ArrayList<Student>();
stus.add(new Student("xiaosi",24));
stus.add(new Student("sunny",24));
stus.add(new Student("yoona",21));
stus.add(new Student("kim",27));
Collections.sort(stus);
for(Student stu : stus){
System.out.println("age" + stu.getAge() + " name->" + stu.getName());
}
~~~
以上实例实现的功能是:按student的age排序,如果年龄相同,则按name排序。
### 2\. Comparator
~~~
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
~~~
说明:
若一个类本身不支持排序,并且没有实现Comparable接口。那么我们可以建立一个该类的比较器来进行排序。这个比较器只需要实现Comparator接口即可。我们可以通过比较器,然后通过该比较器对类进行排序。
举例:
~~~
package com.qunar.test;
/**
* Created by xiaosi on 16-3-7.
*/
public class Teacher {
private String name;
private int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
~~~
比较器:
~~~
package com.qunar.test;
import java.util.Comparator;
/**
* Created by xiaosi on 16-3-7.
* Teacher比较器
*/
public class TeacherComparator implements Comparator<Teacher>{
@Override
public int compare(Teacher o1, Teacher o2) {
if(o1.getAge() == o2.getAge()){
return o1.getName().compareTo(o2.getName());
}//if
else if(o1.getAge() > o2.getAge()){
return 1;
}
return -1;
}
}
~~~
~~~
List<Teacher> teachers = new ArrayList<Teacher>();
teachers.add(new Teacher("xiaosi",24));
teachers.add(new Teacher("sunny",24));
teachers.add(new Teacher("yoona",21));
teachers.add(new Teacher("kim",27));
Collections.sort(teachers,new TeacherComparator());
for(Teacher te : teachers){
System.out.println("age" + te.getAge() + " name->" + te.getName());
}
~~~
### 3\. 比较
Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)。 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。可以说一个是自己完成比较,一个是外部程序实现比较的差别而已。
用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。
Comparable使用:将比较方法写到实体类内对外声明所有比较规则统一按照这一种方式,代码的通用性差,如果改变一种比较规则,代码需要重写
Comparator使用:这种方式的比较实现了实体和比较规则的解绑,实现的比较规则可以根据自己的业务需求调用对应的比较类
- 前言
- [Hibernate开发之路](1)Hibernate配置
- [Hibernate开发之路](2)Hibernate问题
- [Hibernate开发之路](3)基础配置
- [Hibernate开发之路](4)ID生成策略
- [Hibernate开发之路](5)联合主键
- [设计模式实践之路](1)单例模式
- [Java]UDP通信的简单例子
- [Java]套接字地址InetAddress讲解
- [Java开发之路](1)final关键字
- [Java开发之路](2)Java字符串
- [Java开发之路](3)Java常用类
- [Java开发之路](4)String、StringBuffer与StringBuilder详解
- [Java开发之路](5)异常详解
- [Java开发之路](6)File类的使用
- [Java开发之路](7)RandomAccessFile类详解
- [Java开发之路](8)输入流和输出流
- [Java开发之路](9)对象序列化与反序列化
- [Java开发之路](10)DOM解析XML文档
- [Java开发之路](11)SAX解析XML文档
- [Java开发之路](12)JDOM和DOM4J解析XML文档
- [Java开发之路](14)反射机制
- [Java开发之路](15)注解
- [Java开发之路](16)学习log4j日志
- [Java开发之路](18)关于Class.getResource和ClassLoader.getResource的路径问题
- [Java开发之路](19)Long缓存问题
- [Java开发之路](20)try-with-resource 异常声明
- [Java开发之路](21)Comparator与Comparable
- [Java]Java工程师成神之路
- [细说Java](1)图说字符串的不变性
- [细说Java](2)Java中字符串为什么是不可变的
- [细说Java](3)创建字符串是使用&quot; &quot;还是构造函数?