Java中Comparable和Comparator的区别
前言
最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。
两个接口的区别
包区别
Comparable接口是在java.lang下。
Comparator接口是在java.util下。
使用区别
如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现,后面在业务开发中需要有比较排序的功能,就再单独写一个类实现Comparator接口,在里面重写compare()方法,然后这个类需要作为参数传入到工具类Collections.sort和Arrays.sort方法中。
使用场景
主要用于集合排序Collections.sort和Arrays.sort。
使用Comparable接口的实现方案
在定义类的时候,就实现这个接口,将排序规则定义好。
/**
* 实体类,实现Comparable接口
*/
public class Person implements Comparable<Person>{
//属性
private String name;
private int age;
private int salary;
//get和set方法
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;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
//构造方法
public Person(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
//重写接口方法,o为要比较的对象
@Override
public int compareTo(Person o) {
//大于要比较的对象就返回1
if(this.salary>o.getSalary()){
return 1;
}
//小于则返回-1
else if(this.salary<o.getSalary()){
return -1;
}
//相等则返回0
return 0;
}
}
测试方法:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestComparable {
public static void main(String[] args) {
//测试Comparable接口
Person p1=new Person("clyang",18,4000);
Person p2=new Person("messi",30,8000);
Person p3=new Person("ronald",32,9000);
Person p4=new Person("herry",19,7600);
Person p5=new Person("roben",35,7900);
//添加到集合
List<Person> list=new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("-----------------排序前-----------------");
for (Person person : list) {
System.out.println(person);
}
//排序一般使用Collections.sort方法,或者使用Arrays.sort方法,按照比较的元素进行自然排序,即从小到大
Collections.sort(list);
System.out.println("-----------------排序后-----------------");
for (Person person : list) {
System.out.println(person);
}
}
}
使用Comparator
这个接口主要用于实体创建的时候,没有实现接口,但又需要比较的情况。
/**
* 实体类,不实现Comparable接口,使用单独的Comparator接口
*/
public class Staff {
//属性
private String name;
private int age;
private int salary;
public Staff(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Staff{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
创建接口的实现类
import java.util.Comparator;
/**
* 单独写的比较器,实现Compartor接口
*/
public class StaffComparator implements Comparator<Staff> {
//不一定要自然排序即升序,可以反过来写成降序
@Override
public int compare(Staff o1, Staff o2) {
//降序
/*if(o1.getSalary()>o2.getSalary()){
return -1;
}
if(o1.getSalary()<o2.getSalary()){
return 1;
}
return 0;*/
//升序
/*if(o1.getSalary()>o2.getSalary()){
return 1;
}
if(o1.getSalary()<o2.getSalary()){
return -1;
}
return 0;*/
//先按照年龄倒序排,如果年龄相等比较工资
if(o1.getAge()>o2.getAge()){
return -1;
}
if(o1.getAge()<o2.getAge()){
return 1;
}
//能到这里说明年龄相等,继续比较工资
if(o1.getSalary()>o2.getSalary()){
return 1;
}
if(o1.getSalary()<o2.getSalary()){
return -1;
}
return 0;
}
}
测试方法:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestComparator {
public static void main(String[] args) {
//测试Comparator接口
Staff p1=new Staff("clyang",18,4000);
Staff p2=new Staff("messi",30,8000);
Staff p3=new Staff("ronald",32,9000);
Staff p4=new Staff("herry",18,7600);
Staff p5=new Staff("roben",35,7900);
//添加到集合
List<Staff> list=new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("-----------------排序前-----------------");
for (Staff staff : list) {
System.out.println(staff);
}
//排序,需要使用自定义比较类
Comparator myComparator=new StaffComparator();
Collections.sort(list,myComparator);
System.out.println("-----------------排序后-----------------");
for (Staff staff : list) {
System.out.println(staff);
}
}
}
总结
两种接口的最主要区别还是一个对象自己实现和后期实现的区别。
Java中Comparable和Comparator的区别的更多相关文章
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- 你能说说Java中Comparable和Comparator的区别吗
之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- Java 中 Comparable 和 Comparator 比较(转)
转自http://www.cnblogs.com/skywang12345/p/3324788.html 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示 ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- java中Comparable和Comparator两种比较器的区别
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...
- 夯实Java基础(十五)——Java中Comparable和Comparator
1.前言 对于Java中的对象,我们只能使用基本运算符==.!=来判断一下地址是否相等,不能使用>.<来比较大小.但是在实际的开发中,我们需要对对象进行排序,也就是比较大小,那么应该如何实 ...
- Java中Comparable和Comparator你知多少?
前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...
随机推荐
- 换到GitHub 博客了
觉得还是github上面的代码风格看起来舒服些,所以决定把blog搬到github上面去了.以后这里就作为一个放资料的地方吧. github地址:http://l34rner.github.io/
- 如何理解TCP的三次握手协议?
• TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...
- 深度视觉盛宴——CVPR 2016
小编按: 计算机视觉和模式识别领域顶级会议CVPR 2016于六月末在拉斯维加斯举行.微软亚洲研究院在此次大会上共有多达15篇论文入选,这背后也少不了微软亚洲研究院的实习生的贡献.大会结束之后,小编第 ...
- Python Type Hint类型注解
原文地址:https://realpython.com/python-type-checking/ 在本指南中,你将了解Python类型检查.传统上,Python解释器以灵活但隐式的方式处理类型.Py ...
- 《数据结构与算法》—— O(3N)=O(N) ?
上帝的磨盘转动很慢,但是却磨得很细. --毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles ...
- Metaploit-永恒之蓝漏洞利用
目录 Metaploit介绍 实验环境 漏洞利用过程 Metaploit介绍 本次测试主要是利用永恒之蓝漏洞对windows7进行控制利用,掌握Metaploit工具的使用,知道永恒之蓝的漏洞利用原理 ...
- 从头认识js-DOM1
前面说过一个完整的js实现,包括ECMAScript,BOM,DOM三部分,现在就来讲讲DOM的有关知识. DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口).DOM描绘来一 ...
- 为XHR对象所有方法和属性提供钩子 全局拦截AJAX
摘要 ✨长文 阅读约需十分钟 ✨跟着走一遍需要一小时以上 ✨约100行代码 前段时间打算写一个给手机端用的假冒控制台 可以用来看console的输出 这一块功能目前已经完成了 但是后来知道有一个腾讯团 ...
- PHPRAP 1.0.2 发布,修复安装失败 Bug 和优化细节
PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复在MySQL5.5版本下安装数据初始化sql文 ...
- 前端每日实战:145# 视频演示如何用纯 CSS 创作一个电源开关控件
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PdMyJd 可交互视频 此视频是可 ...