java.lang.Comparable接口
转自:http://blog.csdn.net/zccst/article/details/5092920
java.lang.Comparable 接口
作者: zccst
java.lang.Comparable 接口定义的 compareTo() 方法用于提供对其实现类的对象进行整体排序所需要的比较逻辑。
实现类基于 compareTo() 方法的排序被称为自然排序。而 compareTo() 方法的排序被称为它的自然排序。具体的排序原则可由实现类根据需要而定。用户在重写 compareTo() 方法以定制比较逻辑时,需要确保其余等价性判断方法 equals() 保持一致,即 e1.equals((Object)e2) 和e1.compareTo((Object)e2)==0 具有相同的值,这样的话我们就称自然顺序就和 equals 一致。
这个接口有什么用呢?
如果一个数组中的对象实现了 Compareable 接口,则对这个数组进行排序非常简单: Arrays.sort(); 如果 List 实现了该接口的话 , 我们就可以调用Collections.sort 或者 Arrays 方法给他们排序。实际上 Java 平台库中的所有值类 (value classes) 都实现了 Compareable 接口。
Comparable 接口只有一个方法 compareTo(Object obj)
其中
this < obj 返回负
this = obj 返回 0
this > obj 返回正
即将当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象时,分别返回一个负整数、 0 或正整数,如果无法进行比较,则抛出ClassCastException 异常。
其实,有两种方式可以进行集合排序 :
1. 集合中对象的所属类实现了 java.lang.Comparable 接口
2. 为集合指定比较器 java.lang.Comparator 的实现类
Comparator , Comparable 接口的区别是:
comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 comparator 可以看成一种算法的实现,在需要容器集合 collection 需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式,将算法和数据分离,就像 C++ STL 中的函数对象一样。
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有两个:
1. 如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序
2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
例如: Person.java 、 TestComparable.java
(1) Person.java
public class Person implements java.lang.Comparable{
private final int id;
private String name;
private int age;
public Person(int id,String name,int age){
this.id = id;
this.name = name;
this.age = age;
}
public int getId(){
return id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public String toString(){
return "Id: " + id + "/tName: " + name + "/tAge: " + age;
}
@Override
public int compareTo(Object o){ // 实现 Comparable 接口的抽象方法,定义排序规则
Person p = (Person)o;
return this.id - p.id; // 升序排列,反之降序
}
@Override
public boolean equals(Object o){ //equals
boolean flag = false;
if(o instanceof Person){
if(this.id == ((Person)o).id)
flag = true;
}
return false;
}
}
(2) TestComparable.java
import java.util.TreeSet;
import java.util.Iterator;
public class TestComparable{
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person(1003," 张三 ",15));
ts.add(new Person(1008," 李四 ",25));
ts.add(new Person(1015," 王五 ",73));
ts.add(new Person(1001," 赵六 ",49));
Iterator it = ts.iterator();
while(it.hasNext()){
Person employee = (Person)it.next();
System.out.println(employee);
}
}
}
运行结果:
Id: 1001 Name: 赵六 Age: 49
Id: 1003 Name: 张三 Age: 15
Id: 1008 Name: 李四 Age: 25
Id: 1015 Name: 王五 Age: 73
java.lang.Comparable接口的更多相关文章
- Java.lang.Comparable接口和Java.util.Comparator接口的区别
Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...
- java lang(Comparable接口) 和java util(Comparator接口)分析比较
//Comparable 接口强行对实现它的每个类的对象进行整体排序. -- 自然排序.类的compareTo称为自然比较方法. public interface Comparable<T> ...
- java.lang.Comparable 接口 详解
参考https://blog.csdn.net/itm_hadf/article/details/7432782 http://www.blogjava.net/jjshcc/archive/2011 ...
- java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...
- Java之comparable接口
comparable 接口: 1. 问题:java.util.Collections 类中的方法 Collections.sort(List list) 是根据什么确定容器中对象的“大小”顺序的? 2 ...
- Cannot be cast to java.lang.Comparable异常
Set集合中的treeSet问题:cannot be cast to java.lang.Comparable: 原理: Set不保存重复的元素,与Collection类似,只是行为不同,Set是基于 ...
- cannot be cast to java.lang.Comparable
Exception in thread "main" java.lang.ClassCastException: com.myradio.People cannot be cast ...
- Set集合中的treeSet问题:cannot be cast to java.lang.Comparable;
使用TreeSet保存自定义对象时, 必须让定义对象的类实现Comparable接口,并重写compareTo()方法 否则报 实体类User:cannot be cast to java.lang. ...
- java比较器Comparable接口和Comaprator接口
Comparable故名思意是比较,意思就是做比较的,然后进行排序. 1.什么是comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compar ...
随机推荐
- Jquery VailDate初探
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- iOS NSNumber语法糖
BOOL equal; NSNumber * num1 = [NSNumber numberWithInteger:]; NSNumber * num2 = @; equal = [num1 isEq ...
- Java的云打印Lodop
打印某一个网页上的内容我们都经常遇到过,比如网上申请港澳通行证时需要填写申请表,然后把申请表给打印出来.像这样的打印技术是怎么实现?这种打印可以通过一种叫云打印的插件来做,按我的理解云打印的技 ...
- HDU 1175 连连看(BFS)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组
1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...
- 处理safari缓存的办法
window.onpageshow = function(event) { if (event.persisted) { alert("From bac ...
- 检查mysql数据库是否存在坏表脚本
#!/bin/bash #此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表 #变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql ...
- mini2440移植uboot-2008.10 遇到的问题
1.mkimage的使用(u-boot-2008.10/tools/mkimage) 首先./mkimage 运行或者 将mkimage 拷贝到 /bin 目录下面 法一: #mkimage -n ' ...
- Extjs发票管理系统
技术特点:Extjs框架,三层架构,Ajax,json 1.仿office2007菜单.介面美观大方,可动态更改皮肤保存至cookie. 2,json数据源与实体类的相互转换. 3.可下载桌面版登录方 ...
- H5小内容(六)
Web Worker 基本内容 单线程与多线程 Worker可以模拟多线程的效果 定义 - 运行在后台的javascript 注意 - 不能使用DOM ...