写点什么

Collections 和 Objects 的使用注意

作者:zarmnosaj
  • 2022 年 5 月 13 日
  • 本文字数:1496 字

    阅读完需:约 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() 方法是校验参数一旦为空,就会直接抛出异常。

用户头像

zarmnosaj

关注

还未添加个人签名 2020.02.06 加入

还未添加个人简介

评论

发布
暂无评论
Collections和Objects的使用注意_5月月更_zarmnosaj_InfoQ写作社区