我们都知道,实现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的理解的更多相关文章

  1. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  2. 【原】Comparator和Comparable的联系与区别

    1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...

  3. java之Comparator与Comparable

    转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...

  4. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  5. 集合排序 Comparator和Comparable的使用区别

    Java 排序 Compare  Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...

  6. Comparator与Comparable用法与区别

    一.概述.   Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...

  7. Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...

  8. 接口Comparator和Comparable的区别和联系

    1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Pe ...

  9. Map容器——TreeMap及常用API,Comparator和Comparable接口

    TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap), ...

随机推荐

  1. Android 美学设计基础 <3>

    本期接着对Android的美学设计的分享. 1.3 Light and shadows 光学与阴影 1.3.1 Light 在素材设计的环境中,我们会用虚拟的光来照亮UI界面.主灯光会产生尖锐,有方向 ...

  2. FunDA(7)- Reactive Streams to fs2 Pull Streams

    Reactive-Stream不只是简单的push-model-stream, 它还带有“拖式”(pull-model)性质.这是因为在Iteratee模式里虽然理论上由Enumerator负责主动推 ...

  3. python-xlwt给excel添加样式

    #coding:utf-8import osimport time        import xlwt filename="test_xlwt.xls"if os.path.ex ...

  4. fullpage.js与animate.css搭配使用

    jquery的fullpage.js插件的使用 https://alvarotrigo.com/fullPage/#3rdPage   官网 https://github.com/alvarotrig ...

  5. Unity 自动生成组件索引类工具

    Unity 自动生成组件索引类工具 需求由来 我们在写UI类时 需要获取预设中的组件 joystick = transform.Find("joystick"); backgrou ...

  6. 【xsy1201】 随机游走 高斯消元

    题目大意:你有一个$n*m$的网格(有边界),你从$(1,1)$开始随机游走,求走到$(n,m)$的期望步数. 数据范围:$n≤10$,$m≤1000$. 我们令 $f[i][j]$表示从$(1,1) ...

  7. TestNG参数

    dependsOnMethods可以使测试用例按某个特定的顺序执行 实例: @Test(dependsOnMethods=“s”) public  void  a() System.out.print ...

  8. POJ 1047

    #include <iostream> #define MAXN 100 using namespace std; char _m[MAXN]; int ans[MAXN]; int ma ...

  9. WinForm—控制文本框只能输入整数(包括小数)

    //控制控件输入的是正数(包括小数) private void txt_Weight_KeyPress(object sender, KeyPressEventArgs e) { //第一步:判断输入 ...

  10. 钉钉h5项目实战|仿钉钉聊天|h5移动端钉钉案例

    最近一直着手开发h5仿钉钉项目,使用到了h5+css3+zepto+wcPop2等技术进行开发,实现了消息.表情.动图发送,仿QQ多人拼合图像,可以选择本地图片,并可以图片.视频预览,仿微信发红包及打 ...