【原】Comparator和Comparable的联系与区别
1.知识点了解
Comparator和Comparable都是用用来实现集合中元素的比较、排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排序
相同点:
二者的比较方法Comparable的compareTo和compare返回的结果有三种负数、零、正数,分别表示的关系为小于、等于、大于
不同点:
Comparator位于java.util包下,属于Collection的一员;Comparable位于java.lang包下
Comparable是一个内部比较器,实现该接口的对象相当于具有了排序的能力;Comparator是一个外部比较器,可以将两个没有实现排序的对象实现Comparator接口来实现排序,内部与外部是相对于排序代码是否在实现的排序的对象中实现的
Comparator接口中的方法如下:
Comparable中的方法如下所示:
建议Comparator实现java.io.Serializable接口从而序列化,因为它们经常在序列化后的TreeSet、TreeMap等数据结构中使用;equals方法经常被重写来比较引用对象是否是同一个;
2.实际应用
实现按照学生的年龄从小到大、如果年龄相等,则按照姓名的字典排序
2.1 通过Comparator外部比较器来实现排序
Student类:
public class Student {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Student(String name, Integer age){
this.name=name;
this.age=age;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
Comparator实现排序类:
/**
* 实现按照学生的年龄从小到大、如果年龄相等,则按照姓名的字典排序
*/
public class StudentCompartor implements Comparator<Student> { @Override
public int compare(Student s1, Student s2) {
return (s1.getAge()-s2.getAge()==0)?(s1.getName().compareTo(s2.getName())):(s1.getAge()-s2.getAge());
}
public static void main(String[] args){
StudentCompartor pc = new StudentCompartor();
Student p1=new Student("zhangsan",20);
Student p2=new Student("lisi",25);
Student p3=new Student("zhangsan",25);
if(pc.compare(p1,p2)<0){
System.out.println(p1);
System.out.println(p2);
}else{
System.out.println(p2);
System.out.println(p1);
}
//两者年龄相等,按照姓名排序
if(pc.compare(p2,p3)<0){
System.out.println(p2);
System.out.println(p3);
}else{
System.out.println(p3);
System.out.println(p2);
}
}
}
运行结果:
2.2通过Comparable内部比较器来实现排序
Student类:实现了Comparable接口
public class Student implements Comparable<Student> {
private String name;
private Integer 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;
} Student(String name, Integer age) {
this.name = name;
this.age = age;
} @Override
public int compareTo(Student s2) {
return (this.getAge() - s2.getAge() == 0) ? (this.getName().compareTo(s2.getName()))
: (this.getAge() - s2.getAge());
} @Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
内部比较器Comparable实现的排序:
/**
* 实现按照学生的年龄从小到大、如果年龄相等,则按照姓名的字典排序
*/
public class StudentComparable {
public static void main(String[] args) {
Student p1 = new Student("zhangsan", 20);
Student p2 = new Student("lisi", 25);
Student p3 = new Student("zhangsan", 25);
if (p1.compareTo(p2) < 0) {
System.out.println(p1);
System.out.println(p2);
} else {
System.out.println(p2);
System.out.println(p1);
}
// 两者年龄相等,按照姓名排序
if (p2.compareTo(p3) < 0) {
System.out.println(p2);
System.out.println(p3);
} else {
System.out.println(p3);
System.out.println(p2);
}
}
}
运行结果同上所示。
【原】Comparator和Comparable的联系与区别的更多相关文章
- Comparator与Comparable用法与区别
一.概述. Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...
- 集合排序 Comparator和Comparable的使用区别
Java 排序 Compare Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...
- 接口Comparator和Comparable的区别和联系
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Pe ...
- Java基础之comparator和comparable的区别以及使用
Java基础之comparator和comparable的区别以及使用 1: 区别: .Comparable类需要实现此接口,定义在类内,不利于扩展 2 .Comparator更灵活,可以随时自定义 ...
- 玩转 Comparator 和 Comparable 两接口
最近项目中有排序的需求,就查看了一下Java文档,发现有两个接口都可以进行排序,Comparable 和 Comparator 两接口到底有啥区别?何时用?怎么用?使用场景我都在底下一一研究分享出来: ...
- java之Comparator与Comparable
转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...
- java的Comparator和Comparable
java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. ...
- 关于Comparator和Comparable的理解
我们都知道,实现Comparator和Comparable这两个接口,可以实现对对象比较大小.那这个两个又有什么区别呢? comparator 1.接口类在java.util包里面,实现接口时需要导入 ...
- Comparable和Compartor的区别
1.List对象实现Comparable接口,使对象具备可比性 package tao; import java.util.ArrayList; import java.util.Collection ...
随机推荐
- DOM五大对象
1.Window 对象:Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个 ...
- std::string和int类型的相互转换(C/C++)
字符串和数值之前转换,是一个经常碰到的类型转换. 之前字符数组用的多,std::string的这次用到了,还是有点区别,这里提供C++和C的两种方式供参考: 优缺点:C++的stringstream智 ...
- 盗链网易163、腾讯QQ、新浪sina、百度Baidu的图片之PHP独立版
网易相册频道,网易相册确实是一个高质量图片的地方,而且免费,唯一缺点是很多加了水印,但这个不重要了,无意间发现网易163相册频道的图片是防止盗链的,于是便自己写了一个小程序来突破这个. 本盗链图片最新 ...
- C#基础|值类型和引用类型以及传参问题
为了明白什么是值类型和引用类型,先引入你两个概念.堆内存与栈内存 堆内存与栈内存 由于咱的描述能力有限,就不对其下定义了,来看看两者的作用. 共同点: 都是用来存放数据的 不同点: 堆 ...
- Hansight
http://www.hansight.com/scenarios.html#account
- 解决Eclipse乱码的办法
如果在项目中,已经配置了过滤器等各种解决编码问题方法,但是始终解决不了问题,那种考虑下修改eclipse环境本身的编码问题. 在Eclipse中导入新的项目的时候,会遇到乱码的问题,而乱码的问题主要集 ...
- easyui源码翻译1.32--Combo(自定义下拉框)
前言 扩展自$.fn.validatebox.defaults.使用$.fn.combo.defaults重写默认值对象.下载该插件翻译源码 自定义下拉框显示一个可编辑的文本框和下拉面板在html页面 ...
- org.dom4j.DocumentException unknown protocol h
待解析文件的路径中有空格,把空格去掉就好了
- Java Vector 类
Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. Vector主要用在事先不知道 ...
- 判断微信内置浏览器的UserAgent
要区分用户是通过"微信内置浏览器"还是"原生浏览器"打开的WebApp, 可以通过navigator.userAgent来进行判断. 以下是对各种平台上微信内置 ...