一直没有专门看看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的对象。类似于代理模式。