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;
}
}
});

JDK1.8源码分析之Comparable && Comparator的更多相关文章

  1. 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)

    一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...

  2. 集合之TreeSet(含JDK1.8源码分析)

    一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...

  3. 【集合框架】JDK1.8源码分析HashSet && LinkedHashSet(八)

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  4. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  5. 【集合框架】JDK1.8源码分析之HashMap(一) 转载

    [集合框架]JDK1.8源码分析之HashMap(一)   一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化 ...

  6. 【集合框架】JDK1.8源码分析之ArrayList详解(一)

    [集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...

  7. 集合之LinkedHashSet(含JDK1.8源码分析)

    一.前言 上篇已经分析了Set接口下HashSet,我们发现其操作都是基于hashMap的,接下来看LinkedHashSet,其底层实现都是基于linkedHashMap的. 二.linkedHas ...

  8. 集合之HashSet(含JDK1.8源码分析)

    一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和 ...

  9. 【1】【JUC】JDK1.8源码分析之ArrayBlockingQueue,LinkedBlockingQueue

    概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Co ...

随机推荐

  1. 关于form与表单操作

    form表单自动提交规则 form表单中只有一个type=text的input,在input中按enter键,会自动提交: form表单中有多个type=text的input,且无type=submi ...

  2. JQERY EasyUI Tabs 选项卡 自适应浏览器宽度高度 解决方案

    <script type="text/javascript"> $(window).resize(function () { $('#tt').tabs({ width ...

  3. 转:在Struts 2中实现文件上传

    (本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...

  4. HDU - 5521 Meeting (Dijkstra)

    思路: 看了好久才看懂题意,文中给了n个点,有m个集合,每个集合有s个点,集合内的每两个点之间有一个权值为t的边,现在有两个人,要从1号点,和n号点,走到同一个顶点,问最少花费以及花费最少的点. 那就 ...

  5. ELK大流量日志分析系统搭建

    1.首先说下EKL到底是什么吧? ELK是Elasticsearch(相当于仓库).Logstash(相当于旷工,挖矿即采集数据).Kibana(将采集的数据展示出来)的简称,这三者是核心套件,但并非 ...

  6. 以太网 ------ Auto-Negotiation(自动协商)

    说起自动协商(Auto-negotiation),我想很多人都不会陌生.当你把你PC机器上的网卡通过一段双绞线连接到某个交换机的某个端口的时候,如果你的网卡和交换机都支持自动协商功能的话,一件有趣的事 ...

  7. mysql常用快速查询修改操作

    mysql常用快速查询修改操作 一.查找并修改非innodb引擎为innodb引擎 # 通用操作 mysql> select concat('alter table ',table_schema ...

  8. u-boot(三)启动文件

    目录 u-boot(三)启动文件 汇编 C:_start_armboot 代码摘要 C:main_loop 内核启动 菜单处理(自定义实现) 命令处理 title: u-boot(三)启动文件 tag ...

  9. Flink HA 搭建坑

    目前网上能找到的做HA的教程基本都无法真正做到多机高可用,包括官方文档,经过很久的折腾,终于做到了多机高可用,希望其它人不再被坑. 集群模式安装 前提条件: 机器已经安装好Java环境 jobMana ...

  10. Linxu系统下JDK1.7(rpm)安装

    一.JDK下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 二.查看 ...