zoukankan      html  css  js  c++  java
  • JDK1.8源码分析之Comparable && Comparator

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.LinkedList;
    import java.util.List;
    
    public class Test1 {
    
        public static void main(String[] args) {
            List<String> strs = new ArrayList<String>();
            strs.addAll(Arrays.asList("sss","eee","ddd"));
            Collections.sort(strs);
            System.out.println(strs);
            
            List<Person> persons = new LinkedList<Person>();
            persons.addAll(Arrays.asList(new Person("sss",20), new Person("yyy",34), new Person("hhh",12)));
            Collections.sort(persons);//编译报错
            System.out.println(persons);
        }
    }

    问题分析:why编译不通过呢,问题定位在String和Person对象

    查看String的源码,原来是String自身实现Comparable接口,然而Person类没有实现Comparable接口

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence

    查看源码:Comparable 和Comparator都是泛型接口

     Comparable

      1. 类的继承关系 

    public interface Comparable<T>

      说明:Comparable就是一个泛型接口,很简单。

      2. compareTo方法

    public int compareTo(T o);

      说明:compareTo方法就构成了整个Comparable源码的唯一的有效方法。

     Comparator

      1. 类的继承关系  

    public interface Comparator<T>

      说明:同样,Comparator也是一个泛型接口,很简单。

      2. compare方法 

    int compare(T o1, T o2);

      说明:Comparator接口中一个核心的方法。

      3. equals方法

    boolean equals(Object obj);

      说明:此方法是也是一个比较重要的方法,但是一般不会使用,可以直接使用Object对象的equals方法(所有对象都继承自Object)。

    解决办法:按年龄从小到大,name按ascII排序

    方案一、Person同样实现Comparable<Person>接口,实现Compareto()方法

    Person implements Comparable<Person>

    方案二、Collections.sort()传递比较,相比方案一比较灵活,可以友好的定义各种比较器

    Collections.sort(persons, new Comparator<Person>() {
                @Override
                public int compare(Person p1, Person p2) {
                    if(p1.age < p2.age) {
                        return -1;
                    }else if (p1.age == p2.age) {
                        return p1.name.compareTo(p2.name);
                    }else {
                        return 1;
                    }
                }
            });
  • 相关阅读:
    支持向量机(SVM)
    MapReduce(二) MR的高级特性-序列化、排序、分区、合并
    HDFS(二) 底层通信原理——RPC 及 动态代理
    HDFS(一) 高级特性
    UML类图中最重要的几种类关系及其表示
    不同.c文件中声明的全局变量的使用理解
    全局变量和局部变量
    转载 永远不要在.h文件中定义变量!
    LabVIEW介绍
    C语言程序注释风格
  • 原文地址:https://www.cnblogs.com/cherish010/p/8558560.html
Copyright © 2011-2022 走看看