文章目录
前言
本文章帮助大家对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
方法。
比较c1
、c2
,若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
设为参数nullFirst
、real
设为参数real
。
compare
public int compare(T a, T b) { /*...*/ }
实现Comparator
接口的int compare(T o1, T o2)
方法,参考Comparator.compare
方法。
比较a
、b
,若a
、b
均为空,则返回0;若a
、b
非空,real
为空时返回0,real
非空时返回real
比较器的比较结果;若a
为空且b
非空,nullFirst
为true
时返回-1,nullFirst
为false
时返回1;若a
非空且b
为空,nullFirst
为true
时返回1,nullFirst
为false
时返回-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
非空,则组合real
和other
作为返回空值比较器的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"); }
构造函数私有化,使用户无法用此方法进行实例化。此类作为工具类使用即可,无需实例化。类内部使用此方法也将抛异常。
总结
新人源码理解,望大家多多指点。