一直没有专门看看Collections到底能做什么。前几天导师还问到了这个问题。
现在学习总结一下:
Collection是集合类的一个顶级接口,其直接继承接口有List与Set
而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。此类不能实例化。
Collections中有一些工具函数,比如说sort、reverse、fill等等。
还有一些其他很好用的东西:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class comz {
public static void main(String[] ss) {
Collection<Double> list = new ArrayList<Double>();
double array[] = { 112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(array[i]);
}
Collection<Double> unmodifiableCollection = Collections
.unmodifiableCollection(list);
unmodifiableCollection.add(1.2);
for (Double d : unmodifiableCollection) {
System.out.println(d);
}
}
}
上面的代码就是使用它返回了一个不可修改的Collection。这对于开发对外的api来说至关重要(谁都不希望自己给对外用户返回的数据用户自己在Collection上做修改)。
但是需要注意的是,如果我们自己在代码中修改了原始的那个list,那么unmodifiableCollection也会被修改(这里使用了代理模式)。
看下面的例子:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class comz {
public static void main(String[] ss) {
Collection<String> list = new ArrayList<String>();
String array[] = { "a", "b", "c", "d" };
for (int i = 0; i < array.length; i++) {
list.add(array[i]);
}
Collection<String> unmodifiableCollection = Collections
.unmodifiableCollection(list);
System.out.println(list.size());
list.remove("a");
System.out.println(list.size());
System.out.println(unmodifiableCollection.size());
}
}
上面的例子输出是:
4
3
3
-------------------------------------------------------------
看UnmodifiableCollection的源码:
public boolean add(E paramE)
{
throw new UnsupportedOperationException();
}
public boolean remove(Object paramObject)
{
throw new UnsupportedOperationException();
}
这里在操作的时候直接就抛异常了。从而做到了不可修改。
另外,从实现上来看,先看代码
static class UnmodifiableCollection<E>
implements Collection<E>, Serializable
{
private static final long serialVersionUID = 1820017752578914078L;
final Collection<? extends E> c;
UnmodifiableCollection(Collection<? extends E> paramCollection)
{
if (paramCollection == null)
throw new NullPointerException();
this.c = paramCollection;
}
从实现上来看,UnmodifiableCollection仅仅是在类中引用了原始的那个Collection的对象。类似于代理模式。