Collections和Objects的使用注意

138 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Collections和Objects的使用注意

Collections的使用注意

Collections有和Arrays一样的排序方法sort(),也有查找方法,比如binarySearch(),Collections的排序底层方法其实也是用的Arrays.sort(),binarySearch是自己重写的二分查找,但是其逻辑和Arrays的二分查找是一致的。

求集合中最大、小值:

Collections提供了 max 方法来取得集合中的最大值,min 方法来取得集合中的最小值。

max 和 min 都提供了两种类型的方法,一个需要传外部排序器,一个不需要传排序器,但需要集合中的元素强制实现 Comparable 接口。

线程安全的集合

Collections中线程安全的集合方法命名都是 synchronized 开始的,例如:

Collections.synchronizedCollection()

Collections.synchronizedList()

Collections.synchronizedMap()

Collections.synchronizedSet()

......

底层是通过 synchronized 轻量锁来实现的。

例如:

static class SynchronizedList<E>
        extends SynchronizedCollection<E>
        implements List<E> {
    private static final long serialVersionUID = -7754090372962971524L;

    ......

    SynchronizedList(List<E> list, Object mutex) {
        super(list, mutex);
        this.list = list;
    }

    ......

    public E get(int index) {
        synchronized (mutex) {
            return list.get(index);
        }
    }

    public E set(int index, E element) {
        synchronized (mutex) {
            return list.set(index, element);
        }
    }

    ......

    public E remove(int index) {
        synchronized (mutex) {
            return list.remove(index);
        }
    }

    ......

    public boolean addAll(int index, Collection<? extends E> c) {
        synchronized (mutex) {
            return list.addAll(index, c);
        }
    }
}

不可变的集合

获得不可变集合的方法都是以 unmodifiable 开头的。这类方法会从原集合中,得到一个不可变的新集合,新集合只能访问,无法修改;一旦修改,就会抛出异常。主要是因为新集合内部只开放了查询方法,其余任何修改操作都会抛出异常。

例如:

static class UnmodifiableList<E> extends UnmodifiableCollection<E> implements List<E> {
    private static final long serialVersionUID = -283967356065247728L;

    final List<? extends E> list;

    UnmodifiableList(List<? extends E> list) {
        super(list);
        this.list = list;
    }

   ......

    public E get(int index) {
        return list.get(index);
    }
    
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }
        
        ......
}

Objects的使用注意

相等判断

Objects 提供了两种方法进行相等判断,一个是判断基本类型和自定义类的,另一个是用来判断数组的,分别是 equals() 和 deepEquals()。

源码:

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

    public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }

空判断

Objects 提供一些关于空值的判断,其中,isNull() 和 nonNull() 判断对象是否为空,返回 boolean 值。 requireNonNull() 方法是校验参数一旦为空,就会直接抛出异常。