一直沒有專門看看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的對象。類似於代理模式。