Java集合排序(面试必考点之一)
集合是Java面试必考知识点,而集合的排序也是非常重要的,工作中经常用到,那么这个知识点也是必须要掌握的,下面是我曾经面试时被面试官问的问题:




根据API可知,Java集合的工具类Collections提供了两种排序方式:Collections.sort(List list) 和 Collections.sort(List list,Comparator c)。
第一种方式称为自然排序(一般是升序),参与排序的对象需实现comparable接口,重写其compareTo()方法。
第二种方式称为自定义排序,需编写匿名内部类(匿名内部类后面篇章会讲解),先new一个Comparator接口的比较器对象,同时实现compare()其方法,
然后将待排序的List列表对象和比较器对象传给Collections.sort()方法的参数列表中实现排序功能。
特点:第一种方式相对简单,容易掌握(尤其是对匿名内部类不熟悉的同学),由于待比较对象需要实现comparable,增加了耦合度,属性规则排序不够灵活。
第二种方式只需要在需要排序的地方,创建一个内部类的实例,重写其方法即可,灵活度更大。
下面以Person类为例写一个分别按照年龄和姓名排序的例子:
public class Person implements Comparable<Person> {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Person(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    @Override
    public int compareTo(Person o) {
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        } else {
            return 0;
        }
    }
    public static void main(String[] args) {
        List<Person> pList = new ArrayList<>();
        Person p1 = new Person(10, "a张三");
        Person p2 = new Person(18, "c李四");
        Person p3 = new Person(20, "b王五");
        Person p4 = new Person(15, "d陈六");
        pList.add(p1);
        pList.add(p2);
        pList.add(p3);
        pList.add(p4);
        System.out.println("排序前依次输出:");
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }
        // 按照年龄升序排序(默认)
        Collections.sort(pList);
        System.out.println("按年龄升序排序后依次输出:");
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }
        // 按照年龄倒叙排序
        Collections.reverse(pList);
        System.out.println("按年龄倒叙排序后依次输出:");
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }
        // 按照姓名升序排序
        Collections.sort(pList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println("按照姓名升序排序后依次输出:");
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }
    }
}
排序前依次输出:
10===a张三
18===c李四
20===b王五
15===d陈六
按年龄升序排序后依次输出:
10===a张三
15===d陈六
18===c李四
20===b王五
按年龄倒叙排序后依次输出:
20===b王五
18===c李四
15===d陈六
10===a张三
按照姓名升序排序后依次输出:
10===a张三
20===b王五
18===c李四
15===d陈六
关注微信公众号【Java典籍】,收看更多Java干货
▼微信扫一扫下图↓↓↓二维码关注
 
Java集合排序(面试必考点之一)的更多相关文章
- 【转】Java集合框架面试问题集锦
		
Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题.很好地理解集合框架,可以帮助你理解和利用Java的一些高级特性.下面是面试Java核心技术的一些很实用的问题. Q:最常见的 ...
 - java 集合排序(转)
		
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
 - Java集合排序及java集合类详解--(Collection, List, Set, Map)
		
1 集合框架 1.1 集合框架概述 1.1.1 容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...
 - Java集合框架面试题目
		
1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...
 - java 集合排序
		
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
 - Java集合框架 面试问题整理
		
简介 java集合类是java.util 包中的重要内容.java集合框架包含了大量集合接口以及这些接口的实现类和操作他们的算法. java集合框架图 主要提供的数据结构 List 又称有序的Coll ...
 - 基础篇:JAVA集合,面试专用
		
没啥好说的,在座的各位都是靓仔 List 数组 Vector 向量 Stack 栈 Map 映射字典 Set 集合 Queue 队列 Deque 双向队列 关注公众号,一起交流,微信搜一搜: 潜行前行 ...
 - java 32个Java面试必考点
		
转:https://blog.csdn.net/werqerwer 一:https://blog.csdn.net/werqerwer/article/details/88061689 Java职业 ...
 - Java集合排序方法comparable和comparator的总结
		
一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...
 
随机推荐
- 《Java从入门到精通》学习总结1
			
1. Java既是编译型语音,也是解释型语言:先将源代码编译成Java字节码,然后Java虚拟机对Java字节码进行解释运行 2. 使用命令行编译Java源代码时,如果代码中有中文,在编译时需要指定编 ...
 - Mysql数据库性能优化(一)
			
参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要 ...
 - JavaScript 引用错误
			
在学习vue时 出现无法实现效果原始设置 <script src="js/lib/vue2.min.js"/><script src="js/lib/v ...
 - 字符模式console usb串口安装centos
			
黄色部分是使用console口安装centos需要使用text模式,可以参考前文,同时镜像路径也是需要指定的,来自/dev/sda4 U盘 setparams 'Install CentOS 7' l ...
 - NumPy学习_01 ndarray相关概念
			
1.NumPy库 NumPy = Numerical Python 是高性能科学计算和数据分析的基础库. pandas库充分借鉴了NumPy的相关概念,先行掌握NumPy库的用法,才能把pandas的 ...
 - Angular实现动态添加删除表单输入框功能
			
<div class="form-group form-group-sm" *ngFor="let i of login"> <label c ...
 - mysql 报错 Packets larger than max_allowed_packet are not allowed
			
登录 mysql, 执行命令 : show variables like '%max_allowed_packet%' 重新设置: set global max_allowed_packet = 1 ...
 - dubbo入门学习 四 注册中心 zookeeper入门
			
一.Dubbo支持的注册中心 1. Zookeeper 1.1 优点:支持网络集群 1.2 缺点:稳定性受限于Zookeeper 2. Redis 2.1 优点:性能高. 2.2 缺点:对服务器环境要 ...
 - 给div"上"滑动条
			
最近做项目时修改一个遗留的bug,大概是这样:有一个聊天窗口,用户聊天内容展现在窗口上.其实这个窗口是一个带滑动条的div,随着聊天内容的添加,滑动条也越来越长了,这不是重点,重点是每次刷新窗口时候, ...
 - Java:编码与乱码问题
			
一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...