Collections 内部类
- UnmodifiableCollection 返回不可更改的集合视图。对该方法返回的集合视图只允许查看,对他的任何修改操作将会抛出 UnsupportedOperationException 异常。
static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 1820017752578914078L;
final Collection<? extends E> c;
UnmodifiableCollection(Collection<? extends E> c) {
if (c==null)
throw new NullPointerException();
this.c = c;
}
public boolean add(E e) {
throw new UnsupportedOperationException();
}
......// 各种集合操作方法
// 其中修改集合的方法都会抛出 UnsupportedOperationException 异常。
}
-------------------------------------------------------------------------------------
UnmodifiableCollection
-- UnmodifiableList
-- UnmodifiableRandomAccessList
-- UnmodifiableSet
-- UnmodifiableSortedSet
-- UnmodifiableNavigableSet
-- UnmodifiableMap
-- UnmodifiableSortedMap
-- UnmodifiableNavigableMap
- SynchronizedCollection 返回线程安全的集合视图,该方法返回的集合视图可以在多线程环境中使用。
static class SynchronizedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize 同步锁
SynchronizedCollection(Collection<E> c) {
this.c = Objects.requireNonNull(c);
mutex = this;
}
SynchronizedCollection(Collection<E> c, Object mutex) {
this.c = Objects.requireNonNull(c);
this.mutex = Objects.requireNonNull(mutex);
}
public boolean add(E e) {
synchronized (mutex) {return c.add(e);}
}
...... // 各种集合操作方法
// 其中所有方法均使用了 synchroized 关键字进行了同步处理。
}
-------------------------------------------------------------------------------------
SynchronizedCollection
-- SynchronizedList
-- SynchronizedRandomAccessList
-- SynchronizedSet
-- SynchronizedSortedSet
-- SynchronizedNavigableSet
-- SynchronizedMap
-- SynchronizedSortedMap
-- SynchronizedNavigableMap
- CheckedCollection 返回一个动态类型安全视图,对该视图进行添加元素时会自动进行元素类型检查,若检查不一致则抛出 ClassCastException 异常。
例如:我们将编译过后的代码接口提供出去后,泛型会被擦除,这时没有了编译检查,我们此时向集合中添加泛型之外的对象类型是不会报错的,这就为其他错误埋下隐患。若是使用 CheckedCollection 返回的集合类型,则向集合中添加元素时会先进行元素类型检查,类型不一致便会抛出异常,提高了代码的鲁棒性。
static class CheckedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 1578914078182001775L;
final Collection<E> c;
final Class<E> type;
@SuppressWarnings("unchecked")
E typeCheck(Object o) {
if (o != null && !type.isInstance(o))
throw new ClassCastException(badElementMsg(o));
return (E) o;
}
private String badElementMsg(Object o) {
return "Attempt to insert " + o.getClass() +
" element into collection with element type " + type;
}
CheckedCollection(Collection<E> c, Class<E> type) {
this.c = Objects.requireNonNull(c, "c");
this.type = Objects.requireNonNull(type, "type");
}
public boolean add(E e){
return c.add(typeCheck(e));
}
...... // 各种集合操作方法
// add 方法会先检查传入值的类型是否与当前集合允许类型相符,不符则抛出异常。其他方法正常。
-------------------------------------------------------------------------------------
CheckedCollection
-- CheckedQueue
-- CheckedList
-- CheckedRandomAccessList
-- CheckedSet
-- CheckedSortedSet
-- CheckedNavigableSet
-- CheckedMap
-- CheckedSortedMap
-- CheckedNavigableMap
- Empty* 返回一个空的集合视图,其中包括 EmptyList,EmptySet,EmptyMap 。该视图只能为空,不能对他进行任何添加操作或者删除修改操作,即他是一个空的,不可变的集合。优势在于若我们需要一个空的集合时,使用这种方式比 new 一个空的集合更加节省空间。
源码没什么可看的,以集合空为前提重写集合各种操作方法。
-------------------------------------------------------------------------------------
Empty *
-- EmptyList
-- EmptySet
-- EmptyMap
EmptyIterator
EmptyListIterator
EmptyEnumeration
- Singleton* 返回一个只包含一个元素的集合视图,其中包括SingletonList,SingletonSet,SingletonMap,由于规定了集合内部只包含一个元素,因此集合内部使用了单个属性字段代替集合进行数据存储,节省了空间。
// 看一个 List
private static class SingletonList<E>
extends AbstractList<E>
implements RandomAccess, Serializable {
private static final long serialVersionUID = 3093736618740652951L;
private final E element; // 仅仅使用了一个元素代替了整个集合
SingletonList(E obj) {element = obj;}
public Iterator<E> iterator() {
return singletonIterator(element);
}
public int size() {return 1;}
public boolean contains(Object obj) {return eq(obj, element);}
public E get(int index) {
if (index != 0)
throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
return element;
}
...... // 各种集合操作方法,实现前提均为集合中只有一个元素。
}
-------------------------------------------------------------------------------------
Singleton *
-- SingletonList
-- SingletonSet
-- SingletonMap
- CopiesList 返回一个 List,该 List 中存储的元素都是一样的,因此在 List内部只使用了一个元素的空间来维护整个 List 。
private static class CopiesList<E>
extends AbstractList<E>
implements RandomAccess, Serializable
{
private static final long serialVersionUID = 2739099268398711800L;
final int n; // 元素的数量
final E element; // 唯一的元素
CopiesList(int n, E e) {
assert n >= 0;
this.n = n;
element = e;
}
...... // 各种 List 操作方法。
}
-
ReverseComparator 返回一个与自然顺序相反的比较器。
-
ReverseComparator2 返回一个与当前比较器顺序相反的比较器。
-
SetFromMap 通过一个Map 映射返回一个 Set 集合。其中 Map泛型 必须是 <Object , Boolean> ,创建 Set 之前 Map 必须为空。
private static class SetFromMap<E> extends AbstractSet<E>
implements Set<E>, Serializable
{
private final Map<E, Boolean> m; // The backing map
private transient Set<E> s; // Its keySet
SetFromMap(Map<E, Boolean> map) {
if (!map.isEmpty())
throw new IllegalArgumentException("Map is non-empty");
m = map;
s = map.keySet();
}
...... // 方法
}
还不知道用途在哪里...
- AsLIFOQueue 传入一个 Deque 返回一个后进先出队列(栈)。
不贴源码了...
Collections 常用方法
JDK API GO ! ~
网友评论