[重学Java基础][Java内置工具类][Part.2] Collections工具类
===========
Collection与Collections
Collection是集合的最顶层接口,提供了对集合对象进行基本操作的通用接口方法。为各种具体的集合提供了最大化的统一操作方式。
Collentions是一个工具类。它包含各种有关集合操作的静态多态方法,此类的构造方法为private,不能被实例化。
Collections工具类的方法
基于Java 9
根据是否有返回值 可以把Collections工具类的方法
大体上分为两类 一组是返回集合对象的方法
另一组是对传入的集合对象操作的方法
返回集合对象的方法
**这些方法都返回一个重新包装的集合对象 也称之为视图对象
提供了许多重要功能 减少了繁琐的数据结构构建开销**
空集合
空集合指的是没有元素在这些集合中,特别需要主要的是返回的集合都是只读的。只要更改值就会抛出UnsupportedOperationException异常 如果获取元素则抛出下标越界异常
Collections.EMPTY_LIST,Collections.emptyList()//返回只读 的空LIST 集合
Collections.EMPTY_MAP,Collections.emptyMap()//返回只读 的空MAP集合
Collections.EMPTY_SET,Collections.emptySet()//返回只读 的空SET集合
其实底层有一个Empty*类,就是返回一个新的实例。
看源码 以emptyList为例
返回一个内部类 EmptyList
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
EmptyList和ArrayList 一样 都实现了RandomAccess接口 扩展AbstractList抽象类
不一样的是EmptyList内部没有实际的数据序列
所有方法都返回空或者0
private static class EmptyList<E>
extends AbstractList<E>
implements RandomAccess, Serializable {
private static final long serialVersionUID = 8842843931221139166L;
……
空集合主要用于一些需要返回集合的场合
传统的 返回一个新的集合或者匿名集合 无形中增加了内存占用
return new ArrayList<T>();
而返回空集合
return Collections.emptyList();
由源码可知是Collections类的一个static内部类的引用 无论有多少个引用 所占内存都是一样的
单元素集合
Collections中的单元素集合指的是集合只有一个元素而且集合只读。
Collections.singletonList //用来生成只读 的单一元素的List
Collections.singletonMap //用来生成只读 的单Key和Value组成的Map
Collections.singleton //用来生成只读 的单一元素的Set
创建一个String泛型限定的单一元素集合
String string="This is a string";
List<String> list=Collections.singletonList(string);
此单元素集合不能新增 移除元素 否则会抛出异常
其实底层有一个singleton*类,调用方法就返回一个实例
源码 SingletonList为例
private static class SingletonList<E>
extends AbstractList<E>
implements RandomAccess, Serializable {
private static final long serialVersionUID = 3093736618740652951L;
相比空集合 单元素集合有了实际的数据序列
private final E element;
……
}
单元素集合同样实现了RandomAccess接口 扩展AbstractList抽象类
但是重写的集合方法 不支持所有对集合对象的改变操作
运用单元素集合 可以便捷的从集合中移除重复元素
示例
List<String> list = new ArrayList<String>();
list.add("abc");
list.add(null);
list.add("def");
list.removeAll(Collections.singletonList(null));
System.out.println(list); //[abc, def]
只读集合
这些集合一旦初始化以后就不能修改,任何修改这些集合的方法都会抛出UnsupportedOperationException异常。
Collections.unmodifiableCollection()
Collections.unmodifiableList()
Collections.unmodifiableMap()
Collections.unmodifiableSet()
Collections.unmodifiableSortedMap()
Collections.unmodifiableSortedSet()
以上方法都顾名思义
创建一个只读的链表
List