IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java中集合排序方式总结】 -> 正文阅读

[Java知识库]【Java中集合排序方式总结】

一、前言

最近在做一个需求用到了集合的排序,但是这个项目就有点老,用的jdk1.6的,所以不能用Stream流,我就想着把这几种都总结一遍吧,回顾一下。
先说明一下,我们是先对id进行排序,然后再对age进行排序的。

二、方式

(1)Comparator


        Person p1 = new Person(100,108,"赵晓东");
        Person p2 = new Person(5,20,"赵晓北");
        Person p3 = new Person(9,88,"赵晓南");
        Person p4 = new Person(10,100,"赵晓西");
        Person p5 = new Person(15,200,"赵晓天");
        ArrayList<Person>  personList = new ArrayList<Person>();
        personList.add(p1);
        personList.add(p2);
        personList.add(p3);
        personList.add(p4);
        personList.add(p5);
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int c = 0;
                //首先按照Id进行排序
                c =o1.getId()-o2.getId();
                if (c==0){
                    //按照age排序
                    c = o1.getAge()-o2.getAge();
                }
                return c;
            }
        });

        personList.stream().forEach(e-> System.out.println(e));

        System.out.println("====================================================");

展示
```java
Person(id=5, age=20, name=赵晓北)
Person(id=9, age=88, name=赵晓南)
Person(id=10, age=100, name=赵晓西)
Person(id=15, age=200, name=赵晓天)
Person(id=100, age=108, name=赵晓东)
====================================================

(2)Comparable

@Data
@AllArgsConstructor
public class Person implements Comparable<Person>{
    private Integer id;
    private Integer age;
    private String name;

    @Override
    public int compareTo(Person o) {
        int c = 0;
        c=this.id-o.id;
        if (c==0){
            c=this.age-o.age;
        }
        return c;
    }
}

展示

Person(id=5, age=20, name=赵晓北)
Person(id=9, age=88, name=赵晓南)
Person(id=10, age=100, name=赵晓西)
Person(id=15, age=200, name=赵晓天)
Person(id=100, age=108, name=赵晓东)

(3)Stream

        List<Person> personList1 = personList.stream().sorted(Comparator.comparing(Person::getId).thenComparing(Person::getAge)).collect(Collectors.toList());
        personList1.stream().forEach(e-> System.out.println(e));

Person(id=5, age=20, name=赵晓北)
Person(id=9, age=88, name=赵晓南)
Person(id=10, age=100, name=赵晓西)
Person(id=15, age=200, name=赵晓天)
Person(id=100, age=108, name=赵晓东)

三、性能对比

Comparator

执行时长: 0 毫秒.

Comparable

执行时长: 0 毫秒.

Stream

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        List<Person> personList1 = personList.stream().sorted(Comparator.comparing(Person::getId).thenComparing(Person::getAge)).collect(Collectors.toList());
        stopWatch.stop();
        System.out.printf("执行时长: %d 毫秒.%n",stopWatch.getTotalTimeMillis());

执行时长: 61 毫秒.

四、原理

comparable

是一个内比较器,实现了这一个排序接口,可以重写comPareTo方法,compareTo方法的返回值是int,有三种情况:
1、比较者大于被比较者,那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较着,那么返回负整数
同时是可以支持和自己比较的。

Comparator

可以认为是一个外比较器。我们若需要控制某个类的次序,可以简历一个"该类的比较器"来进行排序。
所以如果当我们遇到不想按照原先的类进行排序的时候,可以写一个外部的comparator。

Stream

stream和Collection操作不同,有两个基本的特征
Pipelining: 中间操作队徽返回流对象本身。这样多个操作可以串联成一个管道。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。Stream提供了内部迭代的方式, 通过访问者模式 (Visitor)实现。

五、总结

从用法方面看,Stream更好,但是有的时候项目不是Jdk1.8的就不得不用其它方式了,
comparable是在java.lang包下面的。comparator是在java.util包下面的,
comparable需要实现compareTo方法,comparator需要实现compare方法。
comparable通常需要在类里面写,而comparator不需要设置实体类里面。
从性能上面看,coomparable、comprartor、Stream性能相差不大,但是Stream会更加便利。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:36:51  更:2022-04-14 23:37:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:36:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码