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. 【LOJ#6277】数列分块1

    题目大意:维护一个长度为 N 的序列,支持区间修改.单点查询. 代码如下 #include <bits/stdc++.h> using namespace std; const int m ...

  2. Flask 键盘事件

    <div class="container" style="margin-top: 300px; "> <div class="ro ...

  3. Django(二)框架第一篇基础

    https://www.cnblogs.com/haiyan123/p/7701412.html 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref ...

  4. C实现读写文件

    https://www.cnblogs.com/zhanghongfeng/p/7726199.html https://www.cnblogs.com/xudong-bupt/p/3478297.h ...

  5. FineUILearning

    一:表单控件的学习: 1(1) <f:PageManager > 将对象引用设置到对象的实例,否则页面无法显示: (2)<Menu></Menu>就是下拉菜单控件 ...

  6. Windows下MySQL下载安装、配置与使用

    用过MySQL之后,不论容量的话,发现比其他两个(sql server .oracle)好用的多,一下子就喜欢上了.下面给那些还不知道怎么弄的童鞋们写下具体的方法步骤. (我这个写得有点太详细了,甚至 ...

  7. Zookeeper 集群安装配置

    今天,栈长分享下 Zookeeper 的集群安装及配置. 下载 下载地址:http://zookeeper.apache.org/ 下载过程就不说了,我们下载了最新的zookeeper-3.4.11. ...

  8. qml: 截图(单窗口);

    Item提供了grabToImage方法,能够对窗口内指定区域进行截图: Rectangle { id: source width: 100 height: 100 gradient: Gradien ...

  9. python csv与字典操作

    # encoding: utf-8 import csv d1 = {'banana':3,'apple':4,'pear':1,'orange':2} d2 = {'banana':3,'orang ...

  10. 2017-12-14python全栈9期第一天第六节之用户交互

    9,用户交互.input 1,等待输入, 2,将你输入的内容赋值给了前面变量. 3,input出来的数据类型全部是str 10,基础数据类型初始.数字:int 12,3,45 + - * / ** % ...