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

有以下情景:

  对于 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. Js 验证中文字符长度

    代码如下: //Oracle Varchar2 一个中文对应3个Byte,所以用3个x替换 var commentValue = commentValue.replace(/[^\x00-\xff]/ ...

  2. HDU3068 最长回文串

    题目大意:给出一个字符串,求其回文串的长度.有多组数据. 分析:manacher算法模板题. //在原字符串两边和中间插入一个从未出现的字符,比如‘#’.然后再在最前面插入一个‘*’.#include ...

  3. Building GCC 4.1.2 in CentOS 7 for Maya API development

    Following the official guid: http://help.autodesk.com/cloudhelp/2015/ENU/Maya-SDK/files/Setting_up_y ...

  4. 关于Failed to install helloworld.apk on device 'emulator-5554!的一个解决办法

    好不容易架好了android环境,把该安得都安好了,结果发现在安装过程中创建一个虚拟设备映象就占用了c盘34g的空间,我的系统盘差点瘫了,看来以后就只能先用这一个虚拟设备调试了, 接着说上边这个问题, ...

  5. java.lang.ClassCastException: com.bjsxt.registration.model.User_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy

    1.懒加载 因为此时用的load懒加载机制,到jsp页面在发送sql语句的时候session已经关闭了.所以会报以上错.可以添加过滤器,使session在请求响应完成后再关闭. 过滤器要配置在stru ...

  6. java byte&0xFF

    做串口端口通讯时,数据都是以byte类型发送的 普通的byte范围是-128-127,而java的byte范围是0-255 因此将数据的byte转成java的byte时,需要与0xff(1111111 ...

  7. js判断浏览器

    function myBrowser(){ var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 ; if (isOpera) { ret ...

  8. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  9. Google Developing for Android 三 - Performance最佳实践

    Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07   |   分类于 Android最佳实践 原文 Developing ...

  10. 线程,join合并线程

    在A中,调用B.join()那么,A会“等”B先执行 public class Join01 extends Thread { @Override public void run() { int su ...