首先说明一下这两个都是用来排序的, 只是应用起来有点差别而已.

有以下情景:

  对于 List<String> list = new ArrayList<String>(); 我们可以直接用 Collections.sort(list); 排序. 那么我们如果有自己一个类比如: Person类, 要想在List中排序的话, 怎么做?

1. 使用 Comparable 接口在 Person 类内部实现排序

2. 使用 Comparator 接口自定义一个排序类, 在使用 Collections.sort() 方法的时候传进去, 实现排序.

首先来说第一种方法:

  定义一个Person 类, 实现 Comparable 接口, 并实现其 compareTo(T o) 方法

public class Person implements Comparable<Person> {

    private String name;
    private Integer age;

    public Person() {
        super();
    }

    public Person(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        }
        return 0;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

  关于返回值需要知道:

  a). 返回 正数 表示当前对象比传入的对象大.

  b). 返回 负数 表示当前对象比传入的对象小.

  c). 返回   0   表示等值.

  测试类:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.junit.Test;

public class TestComparable {

    @Test
    public void test() {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person("Tom", 12);
        Person p2 = new Person("Mike", 14);
        Person p3 = new Person("Jerry", 6);
        list.add(p1);
        list.add(p2);
        list.add(p3);
        // 对 list 集合进行排序, 这时Person类中的 compareTo起排序作用.
        Collections.sort(list);
        System.out.println(list);
    }

}

这种方法灵活度差,  只适用于当前类, 通用性差, 但是简单, 只要实现这个接口, 定义了比较的规则,  直接调用 Collections.sort(list); 就可以了.

接下来说第二种方法:

  首先要自己写一个排序类, 并实现 Comparator 接口.

import java.util.Comparator;

public class MyComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        if( o1.charAt(1) > o2.charAt(1) ){
            return 1;
        } else if(o1.charAt(1) < o2.charAt(1)){
            return -1;
        }
        return 0;
    }
}

  当然我这里是给 String 类排序, 只是例子, 因为String 类已经内部利用第一种方法实现了排序, 可以查看 String 的源代码.

  返回值的规则与第一种方法是一样的.

  测试类:

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class TestComparator {

    @Test
    public void test(){
        List<String> list = Arrays.asList("Tom","Mike","Jerry","Kim");
        list.sort(new MyComparator());
        System.out.println(list);
    }

}

  用这个方法的好处是, 不需要修改源代码, 只需要定义比较器就可以了, 然后在排序的时候把比较器传进去就 OK 了.

  也可以写一些通用的比较方法在里面, 提高通用性.

各有好处, 灵活使用就好了.

关于Comparable与Comparator的更多相关文章

  1. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  2. 对象比较器:Comparable和Comparator

    在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...

  3. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  4. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  5. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  6. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  7. Comparable与Comparator

    转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...

  8. Java中的TreeMap、Comparable、Comparator

    我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...

  9. 比较器comparable与comparator的使用

    在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...

  10. 简谈Comparable和Comparator区别

    对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...

随机推荐

  1. 开发语言性能对比,C++、Java、Python、LUA、TCC

    一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修 ...

  2. My Demo Reels

    Some elementary algorithms about discrete differential geometry http://www.cnblogs.com/yaoyansi/p/56 ...

  3. log4net 配置

    1.是直接在代码中通过调用XmlConfigurator.Configure()来解析配置文件,配置日志环境. log4net.Config.XmlConfigurator.Configure(); ...

  4. 红黑树(Red-Black tree)

    红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗自平衡的排序二叉树.我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点,且小 ...

  5. [AS3.0] FMS改变录制视频的默认地址

    FMS默认的视频录制或点播的地址是在{FMS-Install-Dir}\applications,如何指向到其他目录. 1.改变applications的目录指向: 在FMS安装目录下找到/conf/ ...

  6. 【HOW】如何配置SharePoint传入/传出电子邮件设置

    SharePoint 2010的传入和传出邮件配置选项都较简单,但由于需要DNS及Exchange等服务器互相配合,所以要正确配置并不容易. 在微软的官方文档中详细说明了配置步骤:配置传入电子邮件:h ...

  7. LeetCode 328. Odd Even Linked List

    Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...

  8. Esfog_UnityShader教程_NormalMap法线贴图

    咳咳,好久没有更新了,一来是这段时间很忙很忙,再来就是自己有些懒了,这个要不得啊,赶紧补上.在前面我们已经介绍过了漫反射和镜面反射,这两个是基本的光照类型,仅仅依靠它们就想制作出精美的效果是远远不够的 ...

  9. 无需写try/catch,也能正常处理异常 (转)

    原文地址: http://www.cnblogs.com/artech/archive/2012/10/28/automatic-exception-handling-aspnet.html 对于企业 ...

  10. Android学习起步 - 新建工程及相关

    新手起步迷迷糊糊,以下记录迷惑之处,大家共勉!!! 1.创建安卓应用工程 选择Andriod Application Project 点下一步直到完成. 二.下面是新建工程注意的地方 (1)首选删除系 ...