Comparable与Comparator
Compator和Comparable都可以用于集合或者数组的排序。
但Comparable是在类内定义比较方法,主要用于对象内部的比较方式,对象需要实现Comparable接口
而Compator则是在类外定义比较方法,用作自定义的比较方式
总结:Comparator是比较器,实现Comparable的对象自身可以直接比较
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
像Arrays和Collections中的排序方法,当不指定Comparator时使用的就是默认排序方式,也就是使用Comparable。指定Comparator时就是使用提供的比较器。
sort(Object[]) 所有的对象都必须实现Comparable接口,它用来确定对象之间的大小关系
sort(Object[], Comparator) 对象不必实现Comparable接口,由Comparator比较器来确定对象之间的大小关系。
Comparable接口位于java.lang包下:
public interface Comparable<T>{public int compareTo(T o);//唯一一个方法 }
Comparator接口位于java.util包下:
public interface Comparator<T>{int compare(T o1, T o2);......//还有其他方法 }
自定义一个类分别演示下两个接口的用法:
一、实现Comparable接口:
1.
public class User implements Comparable{ private String id; private String name; private int age;public User(String id, String name, int age) { this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } 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(Object o) { return this.age - ((User) o).getAge(); } }import java.util.Arrays;public class SampleComparable { public static void main(String[] args) { User[] users = new User[] { new User("a","name1", 30), new User("b","name2", 20),new User("c","name3", 25) }; Arrays.sort(users); for (int i = 0; i < users.length; i++) { User user = users[i]; System.out.println(user.getId() + " " + user.getAge()); } } }
2.
public class Test {public static void main(String[] args){List<Person> list = new ArrayList<Person>();list.add(new Person(20));list.add(new Person(19));list.add(new Person(21));for(Person p : list)System.out.println(p.getAge());Collections.sort(list);for(Person p : list)System.out.println(p.getAge());} }class Person implements Comparable<Person>{private int age;public Person(int age){this.age = age;}public int compareTo(Person anotherPerson){if(age == anotherPerson.age)return 0;else if(age < anotherPerson.age)return -1;elsereturn 1;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} }
二、实现Comparator接口:
1.
import java.util.Arrays; import java.util.Comparator;public class SampleCompartor { public static void main(String[] args) { String[] array = new String[] { "BCD", "ABC", "Cdb" }; Arrays.sort(array, new Comparator<String>(){ @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } });for(int i=0;i<array.length;i++){ System.out.println(array[i]); } } }
2.
public class Test {public static void main(String[] args){List<Person> list = new ArrayList<Person>();list.add(new Person(20));list.add(new Person(19));list.add(new Person(21));for(Person p : list)System.out.println(p.getAge());Collections.sort(list, new PersonComparator());for(Person p : list)System.out.println(p.getAge());} }class Person{private int age;public Person(int age){this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} }class PersonComparator implements Comparator<Person>{public int compare(Person p1, Person p2){if(p1.getAge() == p2.getAge())return 0;else if(p1.getAge() < p2.getAge())return -1;elsereturn 1;} }
两者的选择:
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要在类内部进行方法的定义,如遇到复杂的比较逻辑,代码看起来会比较混乱冗余, 用Comparator 的好处是不需要将比较方法定义在类内,代码的分离性较好。
转载于:https://www.cnblogs.com/pluto-yang/p/9330009.html
Comparable与Comparator相关推荐
- Java 中 Comparable 和 Comparator 比较
为什么80%的码农都做不了架构师?>>> 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comp ...
- Java 解惑:Comparable 和 Comparator 的区别
读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢? ...
- 对象比较:Comparable 和 Comparator
java中我们如何给对象排序?这就必须借助Comparator 或 Comparable.有了他们就意味着你可用实现对象之间的比较.也就可用做到排序了. Comparable Comparable 也 ...
- Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...
- java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序
本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...
- Java中Comparable和Comparator区别小结
阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Comparable简介 Comparable是排序接口.若 ...
- comparable和comparator比较
今天在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparat ...
- Java中Comparable与Comparator的区别
一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集 ...
- Comparable与Comparator浅析
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- Java中Comparable和Comparator接口区别分析
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...
最新文章
- BERT 预训练模型及文本分类(情感分类)
- Vivado中IP核的xci, xcix, .dcp文件的区别
- linux系统预定义变量有哪些,Shell预定义变量用法详解
- 四大基本反应类型的关系_初中化学7大反应类型总结,收藏
- 基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...
- 我是怎么用机器学习技术找到女票的
- 开源微服务编排框架:Netflix Conductor
- swagger的使用方式
- java判断long 大于0_JAVA的一道习题:找出五个大于Long.MAX_VALUE的素数
- 电机与拖动基础第四版_伺服电机控制
- cad计算机画图标准,CAD画图某些常用尺寸及作图习惯
- [项目管理]-第九章:项目管理计划
- 蚁人2:黄蜂女现身全集百度云资源
- 港股交易系统搭建介绍 — 港股LV2行情
- 微博相册下载助手v7.2 微博图片批量下载神器
- PS图层模式详细讲解
- 解决PHP报错No input file specified
- VScode修改html代码后,浏览器页面更新不及时
- Django项目骨架与常见配置修改
- Cocos技术派 | TS版属性面板定义高级用法