关于Comparator和Comparable的理解
我们都知道,实现Comparator和Comparable这两个接口,可以实现对对象比较大小。那这个两个又有什么区别呢?
comparator
1、接口类在java.util包里面,实现接口时需要导入该包。
2、一般新建一个类实现这个接口,用来比较其他对象的大小。实现这个接口时,对象不能把自己和其他对象相比较。
3、实现public int compare(Object o1, Object o2),当实现类使用了泛型时,Object可以换成具体的类型。
import java.util.Comparator;
public class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
//在这里我们把age作为对象比较大小的依据
if (o1.getAge() > o2.getAge())
return 1;
else if (o1.getAge()<o2.getAge())
return -1;
return 0;//如果两个对象相等,返回0
}
}
comparable
1、接口类在java.lang包里面,实现接口时无需导包。
2、一般是需要比较大小的类直接实现这个接口,因为实现这个接口时,支持自己直接和另一个对象比较大小。
3、实现public int compareTo(Object o)方法,当实现类使用了泛型时,Object也可以换成具体的类型
public class Student implements Comparable<Student> {
private String name;
private int age;
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(Student student) {
//在这里我们把age作为对象比较大小的依据
if (this.age > student.getAge())
return 1;
else if (this.age<student.getAge())
return -1;
return 0;//如果两个对象相等,返回0
}
}
相同点
两者实现的函数的返回值一样,都是int类型的。当要对对象按照某个属性进行比较大小排序时,返回值不同,会影响排序的顺序。例如,如果按照年龄的大小对Student进行排序时,如果按照从小到大的顺序进行排序时,compareTo的实现方法如下:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
如果按照从大到小的顺序进行排序时,只需把1和3中的返回值互换。
实现排序的主函数如下所示:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; public class Main {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("张三");
s1.setAge(18); Student s2 = new Student();
s2.setName("李四");
s2.setAge(19); Student s3 = new Student();
s3.setName("王五");
s3.setAge(22); List<Student> list = new ArrayList<Student>();
list.add(s2);
list.add(s3);
list.add(s1);
、
Student[] students1 = new Student[list.size()];//数组的大小需要和集合的长度保持一致,如果数组过长,后面会被自动赋值null,排序时报空指针异常
list.toArray(students1);//集合转换成数组 list.sort(new StudentComparator());//集合排序
Arrays.sort(students1);//数组排序 for (Student student : list) {
System.out.println(student.getName());
}
}
}
关于Comparator和Comparable的理解的更多相关文章
- Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...
- 【原】Comparator和Comparable的联系与区别
1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...
- java之Comparator与Comparable
转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...
- java的Comparator和Comparable
java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. ...
- 集合排序 Comparator和Comparable的使用区别
Java 排序 Compare Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...
- Comparator与Comparable用法与区别
一.概述. Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...
- Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...
- 接口Comparator和Comparable的区别和联系
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Pe ...
- Map容器——TreeMap及常用API,Comparator和Comparable接口
TreeMap及常用API ① TreeMap类通过使用红黑树实现Map接口; ② TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③ 不像散列(HashMap), ...
随机推荐
- Java基础学习篇---------继承
一.覆写(重写) 1.含义:子类的定义方法.属性和父类的定义方法.属性相同时候 方法名称相同,参数相同以及参数的个数也相同,此时为覆写(重写) 扩充知识点: 覆盖:只有属性名字和方法名字相同,类型.个 ...
- 通过修改EIP寄存器实现32位程序的DLL注入
功能:通过修改EIP寄存器实现32位程序的DLL注入 <如果是64位 记得自己对应修改汇编代码部分> 原理:挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器 ...
- python stdout 重定向
import sys class Buffer(object): def __init__(self): self.buffer = [] def write(self, *args, **kwarg ...
- NSTimer、performSelector 函数没有被调用的原因
performSelector 指定的方法没有被调用 Invokes a method of the receiver on the current thread using the default ...
- spring cloud ribbon源码解析(二)
在上一篇文章中主要梳理了ribbon的执行过程,这篇主要讲讲ribbon的负载均衡,ribbon的负载均衡是通过ILoadBalancer来实现的,对ILoadBalancer有以下几个类 1.Abs ...
- ajax获取json数据及实现跨域请求
最近想练习一下ajax获取json数据 , 首先上网找一些在线的可用来测试的接口. -----------------------------------------------------这里是接口 ...
- 【4】JMicro微服务-服务限流
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 通过配置SMethod的maxSpeed属性实现服务限流,单位是个/每秒(qps),也就是服务方法每秒允许接收的最大请求个数 ...
- POJ 2389
#include <iostream> #include <algorithm> #include <string> #define MAXN 300 using ...
- js时间的应用(再看看前面,会发现不一样的)
1.年份(1970-) 获取 date.getFullYear(); 设置 date.setFullYear(2016); 2.月份(0-11) 0代表1月 获取 date.getMonth() 设置 ...
- Oracle 常见字符操作
一.拼接 1.使用 || 来实现 SELECT '你'||'好!' title FROM dual; 2.使用concat (不支持多个字符串的拼接,但是可以嵌套调用) SELECT concat(' ...