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 list = new ArrayList();
		double array[] = { 112, 111, 23, 456, 231 };
		for (int i = 0; i < array.length; i++) {
			list.add(array[i]);
		}
		Collection 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 list = new ArrayList();
		String array[] = { "a", "b", "c", "d" };
		for (int i = 0; i < array.length; i++) {
			list.add(array[i]);
		}
		Collection 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
  implements Collection, Serializable
  {
    private static final long serialVersionUID = 1820017752578914078L;
    final Collection c;

    UnmodifiableCollection(Collection paramCollection)
    {
      if (paramCollection == null)
        throw new NullPointerException();
      this.c = paramCollection;
    }

从实现上来看,UnmodifiableCollection仅仅是在类中引用了原始的那个Collection的对象。类似于代理模式。

你可能感兴趣的:(java语言)