集合是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集合排序(面试必考点之一)的更多相关文章

  1. 【转】Java集合框架面试问题集锦

    Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题.很好地理解集合框架,可以帮助你理解和利用Java的一些高级特性.下面是面试Java核心技术的一些很实用的问题. Q:最常见的 ...

  2. java 集合排序(转)

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  3. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

  4. Java集合框架面试题目

    1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...

  5. java 集合排序

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  6. Java集合框架 面试问题整理

    简介 java集合类是java.util 包中的重要内容.java集合框架包含了大量集合接口以及这些接口的实现类和操作他们的算法. java集合框架图 主要提供的数据结构 List 又称有序的Coll ...

  7. 基础篇:JAVA集合,面试专用

    没啥好说的,在座的各位都是靓仔 List 数组 Vector 向量 Stack 栈 Map 映射字典 Set 集合 Queue 队列 Deque 双向队列 关注公众号,一起交流,微信搜一搜: 潜行前行 ...

  8. java 32个Java面试必考点

    转:https://blog.csdn.net/werqerwer 一:https://blog.csdn.net/werqerwer/article/details/88061689  Java职业 ...

  9. Java集合排序方法comparable和comparator的总结

    一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...

随机推荐

  1. linklist和arraylist区别

    ArrayList更适合读取数据,linkedList更多的时候添加或删除数据.

  2. Memcached和Memcache安装(64位win7)[z]

    http://www.cnblogs.com/lucky-man/p/6126667.html 一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理 ...

  3. error: command 'gcc' failed with exit status 1

    MacOS下想安装MySQL-Python,执行语句: sudo pip install MySQL-Python 遇到了如下错误信息: /Users/kaitlyn/anaconda3/envs/e ...

  4. 如何配置nginx屏蔽恶意域名解析指向《包含隐藏nginx版本号》

    恶意域名指向: 比如,有一个垃圾域名将解析指向到了你们服务器的IP,一般多一个解析可能不会有什么问题,但是现在全民备案时期,可能你的运营商会联系你,说你们的域名没备案,可能会封你们的80端口,然后会导 ...

  5. 浅谈Java和PHP的异同

    编程范式: Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int.double.boolean.byte.float.long.short. ...

  6. java38

    字符串内存分析 String str = new String("ABCD") 会先在堆中开辟一个空间,然后去常量池(方法区)中寻找是否有该变量,如果有,直接引用常量池中的内容 如 ...

  7. web端常见测试点

    由于web端应用于用户直接相关,又通常需要承受长时间的大量操作,因此web项目的功能和性能都必须经过可靠的验证.web端测试常见的有界面测试.功能测试.性能测试.可用性(接口)测试.兼容性测试.安全性 ...

  8. linux系统下部署DNS反向解析

    DNS服务概述 DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 反向解析 反向解析是从IP地址到域名的解析过程.主要作用于服务器的身份验证. 部署反向解析 ...

  9. P4178 Tree

    最简单的点分治 淀粉质的思想: “分而治之”,缩小问题规模,合并求解: #include<cstdio> #include<cmath> #include<cstring ...

  10. 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)

    传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...