Java中Collections學習


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

發佈了339 篇原創文章 · 獲贊 66 · 訪問量 236萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章