Comparators类源码理解

35 篇文章 0 订阅
34 篇文章 0 订阅


前言

本文章帮助大家对Comparators类的理解。


一、概述

Comparators意为比较器(复数)。顾名思义,比较器相关。此类仅开放静态方法,不能生成实例,作为一个比较器相关的工具类。它提供若干比较器实现类,若需要获取自然序比较器、空值比较器等,建议使用该工具类。

二、源码理解

package java.util;

Comparators类

class Comparators { /*...*/ }

public类,仅本包可用。

NaturalOrderComparator

NaturalOrderComparator意为自然序比较器。顾名思义,提供自然序比较逻辑的比较器。

enum NaturalOrderComparator implements Comparator<Comparable<Object>> { /*...*/ }

public枚举类,可拥有静态枚举实例成员。实现Comparator<Comparable<Object>>接口,具有它的方法,且比较元素是可比较的。参考Comparator接口、Comparable接口。

NaturalOrderComparator变量
INSTANCE
INSTANCE;

静态枚举常量。表示此类的实例。

NaturalOrderComparator方法
compare
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
    return c1.compareTo(c2);
}

实现Comparator接口的int compare(T o1, T o2)方法,参考Comparator.compare方法。

比较c1c2,若c1小于c2,返回负数;若c1等于c2,返回0;若c1大于c2,返回正数。参考Comparable.compareTo方法。

reversed
public Comparator<Comparable<Object>> reversed() {
    return Comparator.reverseOrder();
}

重写Comparator接口的Comparator<T> reversed()方法,参考Comparator.reversed方法。

返回一个与参数比较逻辑相反的比较器,有o1.compareTo(o2) == reversed().compare(o2, o1)。参考Comparator.reverseOrder方法。

NullComparator

NullComparator意为空值比较器。顾名思义,提供可空值比较逻辑的比较器。

static final class NullComparator<T> implements Comparator<T>, Serializable { /*...*/ }

public final类,无法继承,静态类。使用类时传入泛型T,为比较对象的元素的类型。实现Comparator<T>接口,具有它的方法,参考Comparator接口;实现Serializable可序列化接口,为使比较数据反序列化后仍能使用一同反序列化的此比较器比较。参考Serializable

NullComparator变量
serialVersionUID
private static final long serialVersionUID = -7569533591570686392L;

静态私有常量。表示此类的序列化版本号,保证反序列化能成功。

nullFirst
private final boolean nullFirst;

私有常量。为true时比较逻辑null为小,否则为大。

real
private final Comparator<T> real;

私有常量。当比较值均非空时,使用real比较器比较。

注意:若real为空,则非空值比较结果为相等。

NullComparator方法
NullComparator
NullComparator(boolean nullFirst, Comparator<? super T> real) { /*...*/ }

public构造函数,将成员变量nullFirst设为参数nullFirstreal设为参数real

compare
public int compare(T a, T b) { /*...*/ }

实现Comparator接口的int compare(T o1, T o2)方法,参考Comparator.compare方法。

比较ab,若ab均为空,则返回0;若ab非空,real为空时返回0,real非空时返回real比较器的比较结果;若a为空且b非空,nullFirsttrue时返回-1,nullFirstfalse时返回1;若a非空且b为空,nullFirsttrue时返回1,nullFirstfalse时返回-1。

thenComparing
public Comparator<T> thenComparing(Comparator<? super T> other) {
    Objects.requireNonNull(other);
    return new NullComparator<>(nullFirst, real == null ? other : real.thenComparing(other));
}

重写Comparator接口的public Comparator<T> thenComparing(Comparator<? super T> other)方法,参考Comparator.thenComparing方法。

组合此比较器和other比较器的比较逻辑,返回比较器(空值比较器)逻辑为:若此比较器real为空,则other作为返回空值比较器的real比较器;若此比较器real非空,则组合realother作为返回空值比较器的real比较器。若other为空,则抛出NullPointerException异常,参考Objects.requireNonNull方法。

注意:此方法和一般的Comparator.thenComparing方法逻辑不同:若比较参数含有空值,无论首次比较结果是否相等,other比较器不执行,返回首次比较结果;若比较参数均非空,则进行other比较或一般的real.thenComparing(other)比较。若返回比较器中出现异常,那么这些异常会交给返回比较器的调用方处理。

reversed
public Comparator<T> reversed() { return new NullComparator<>(!nullFirst, real == null ? null : real.reversed()); }

重写Comparator接口的Comparator<T> reversed()方法,参考Comparator.reversed方法。

返回一个与此比较器比较逻辑相反的比较器(空值比较器),有compare(o1, o2) == reversed().compare(o2, o1)

Comparators方法

Comparators

private Comparators() { throw new AssertionError("no instances"); }

构造函数私有化,使用户无法用此方法进行实例化。此类作为工具类使用即可,无需实例化。类内部使用此方法也将抛异常。


总结

新人源码理解,望大家多多指点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值