Java中Comparable与Comparator的区别
来源:互联网 发布:区块链的共识机制 算法 编辑:程序博客网 时间:2024/05/29 17:53
在Java中Comparable和Comparator都是对集合进行排序的,都是通过返回-1、0、1来进行交换,但是两种方式有差别。
- Comparable:使用集合内部元素的排序方法(compareTo)进行排序,所以内部比较的元素要实现Comparable接口。
- Comparator:使用外部Comparator对象的(compare方法)排序方式,所以集合需要实现Comparator接口的对象。
例如我们又一个Person类,如果我们把该类的对象放入list集合当中,对象在集合中的顺序就是放入的顺序。
import java.util.ArrayList;public class ComparableTest { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Person> list=new ArrayList<>(); list.add(new Person("a", 20)); list.add(new Person("b", 16)); list.add(new Person("c", 50)); for(int i=0;i<list.size();i++){ System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age); } }}class Person{ String name; int age; Person(String name,int age){ this.name=name; this.age=age; }}
输出结果是:
name:a;age:20
name:b;age:16
name:c;age:50
但是如果我们想要person对象在集合中的顺序是按年龄排序的了,这时候我们就需要对集合进行排序了。可以使用Collections.sort方法。使用Collections.sort有两种方式:
- sort(List list),直接传入集合对象,但需要集合的内部元素有实现Comparable,它采用的内部类的compareTo方法进行比较。
- sort(List list, Comparator< super T> c) ,该方法不仅需要传入排序的集合,还有实现Comparator接口的对象,它采用Comparator对象的compare进行比较。
1.使用内部元素的排序方法,需要实现Compareble。
package execise;import java.util.ArrayList;import java.util.Collections;public class ComparableTest { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Person> list=new ArrayList<>(); list.add(new Person("a", 20)); list.add(new Person("b", 16)); list.add(new Person("c", 50)); Collections.sort(list); for(int i=0;i<list.size();i++){ System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age); } }}class Person implements Comparable<Person>{ String name; int age; Person(String name,int age){ this.name=name; this.age=age; } @Override public int compareTo(Person p) { // TODO Auto-generated method stub if(age==p.age) return 0; else if(age>p.age) return 1; else return -1; }}
运行结果:
name:b;age:16
name:a;age:20
name:c;age:50
2.使用Comparator对象。
package execise;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class ComparableTest { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Person> list=new ArrayList<>(); list.add(new Person("a", 20)); list.add(new Person("b", 16)); list.add(new Person("c", 50)); Collections.sort(list, new Comparator<Person>(){ @Override public int compare(Person p1, Person p2) { // TODO Auto-generated method stub if(p1.age==p2.age) return 0; else if(p1.age>p2.age) return 1; else return -1; } }); for(int i=0;i<list.size();i++){ System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age); } }}class Person { String name; int age; Person(String name,int age){ this.name=name; this.age=age; }}
运行结果:
name:b;age:16
name:a;age:20
name:c;age:50
3.总结
两种方式采用Comparator更好一些,因为Comparable代码侵入太高,比较部分和类的逻辑耦合在一起,如果要改变排序方法就必须修改类的代码;而Comparator的耦合低。
2 0
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- Java中Comparable与Comparator的区别
- java中Comparable与Comparator的区别与用法
- Java语言中comparable与comparator接口的区别
- Java中Comparator接口与Comparable接口的区别
- Java中 Comparator接口 与Comparable 的区别
- Java中Comparable与Comparator的区别(一)
- Java中 Comparator接口 与Comparable 的区别
- STM32标准外设库中USE_STDPERIPH_DRIVER, STM32F10X_MD的含义
- exgcd之求解最小正整数解
- 基于STM32L476RG的SPI DMA的调试
- 使用jQuery开发Todos实录
- 智能遥控瓦力 - EZ-Builder初探
- Java中Comparable与Comparator的区别
- 图的最小生成树的两种算法
- 【JAVA语言程序设计基础篇】--图形用户界面基础--Swing GUI组件的公共特性
- win7 64位安装scikit-learn机器学习库
- Python科学计算-----NumPy(一)
- PAT乙级(Basic Level)1042(Java)
- 查出区间整数
- Stress中常见问题及相关logcat
- Visual Studio开始Python编程 && Windows下用PyCharm