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是在集合外部 ...
随机推荐
- Quartz.Net 定时服务
http://www.cnblogs.com/jys509/p/4628926.html https://www.cnblogs.com/AmyLo/p/8125505.html https://bl ...
- 《笨方法学Python》加分题29
加分练习猜一猜 “if 语句” 是什么,他有什么作用.在做下一道题之前,试着用自己的话回答下面的问题: 你认为 if 对他下一行代码做了什么?为什么 if 语句的下一行需要 4 个空格缩进?如果不缩进 ...
- awk命令小结
先在此至敬朱双印老师,博客写得很详细:http://www.zsythink.net/archives/tag/awk/ 这是朱双印老师关于awk博客的链接,强力推荐给大家 AWK一般在网上说是一 ...
- weblogic中配置数据源
Weblogic数据源配置 一.配置数据源 1.点击数据源,进入数据源配置页面,点击新建后选择一般数据源 2.输入名称和jndi名称(两个输入一样即可)后点击下一步 3.选择驱动后点击下一步 4.输入 ...
- 手绘raft算法
手绘raft算法 互联网技术窝 2019-04-07 12:06:05 在现实的分布式系统中,不能可能保证集群中的每一台机器都是100%可用可靠的,集群中的任何机器都可能发生宕机.网络连接等问题导致集 ...
- Go的并发调度原理
Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言:也正是Go语言的并发特性,吸引了全球无数的开发者. 并发(concurrency)和并行(parallellism) 并发 ...
- STS中logback.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false ...
- es6数值
ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个特殊值. Number.isFinite(15); ...
- 图解HTTP第十章
Web 的攻击技术 1>在客户端即可篡改请求 2>针对 Web 应用的攻击模式 3>因输出值转义不完全引发的安全漏洞 [1]跨站脚本攻击 [2]SQL 注入攻击 [3]OS 命令注入 ...
- AHOI——Day1个人感悟
今天,是个bilibili的日子.(嗯?什么意思?) 洛谷已经尽力了: 于是我带着洛谷的祝福,来到了AHOI的考场--合肥一中. 其实我是考完才签到的,我一大早五点多就起来了,到考场后,在肯德基吃了早 ...