Collections五种返回集合的特性分析

来源:互联网 发布:网络综合布线设计图 编辑:程序博客网 时间:2024/06/05 09:42

一、返回集合的方法


1. 返回空集合

EmptyList emptyList = Collections.emptyList();

返回空的List集,不可写,下面是从继承关系上分析

1.AbstractList实现List接口,实现了add(E e)方法

2.AbstractList中的add方法的实现仅仅是抛出异常:UnsupportedOperationException()

public void add(int index, E element) {    throw new UnsupportedOperationException();}

3.EmytyList继承AbstractList,没有重写add方法


2. 返回受检集合

/** * 返回受检的List集合:可读可写 */Collections.checkedList();

返回特定类型元素的集合,再次添加的时候,会报类型转换错误

List<Object> list = new ArrayList<Object>();list.add("123");list.add(new Integer(0));//指定list中存储的元素类型Class type = String.class;List checkedList = Collections.checkedList(list, type);checkedList.add("hello");System.out.println(checkedList);//输出结果:[123, 0, hello]
//将integer类型的数据添加到受检的String元素类型的集合checkedList.add(new Integer(11));//java.lang.ClassCastException: Attempt to insert class java.lang.Integer element into collection with element type class java.lang.String

3. 返回不可修改集合

List<Object> list = new ArrayList<Object>();List<Object> unmodifiableList = Collections.unmodifiableList(list);

3.1.不可修改集合元素是针对的返回的不可修改的集合(指向的是原集合的引用),对原集合的修改,依然有效

List<Object> list = new ArrayList<Object>();list.add("123");List<Object> unmodifiableList = Collections.unmodifiableList(list);list.add("456");System.out.println(unmodifiableList);//输出结果:[123, 456]

3.2.不可添加元素

unmodifiableList.add("789");//报UnsupportedOperationException异常

1.UnmodifiableCollection实现Collection接口,重写add(E e)方法

public boolean add(E e) {    throw new UnsupportedOperationException();}

2.UnmodifiableList继承UnmodifiableCollection,没有重写add方法


4. 返回单元素集合

//返回单元素Set集合Set<T> set = Collections.singleton(T o);//返回单元素List集合Collections.singletonList(T o);//返回单元素Map集合Collections.singletonMap(key, value);

以Set为例:返回仅包含一个元素、不可修改(待确定)和只读的Set集合

4.1.一个元素、不可修改

定义了一个final类型的元素,初始化实在构造器中完成的,元素是作为参数传入构造器的

 private final E element; SingletonSet(E e) {     element = e; }

不可修改是有限定条件的,取决于元素本身是否可以修改,element拿到的是元素的引用而已

String s = "hello";Set<String> singletonSet = Collections.singleton(s);s = "world";System.out.println(singletonSet);//输出结果:[hello],单元素集合的元素并没有被改变,因为String本身是不可变的(immutable)
List<Object> list = new ArrayList<Object>();list.add("123");Set<List<Object>> singleton = Collections.singleton(list);list.add("456");System.out.println(singleton);//输出结果:[[123, 456]].单元素集合的元素被改变,因为List本身是可变的(mutable)

4.2.只读:从继承关系上分析

1.AbstractCollection实现Collection接口,实现了add(E e)方法

2.AbstractCollection中的add方法的实现仅仅是抛出异常:UnsupportedOperationException().

public void add(int index, E element) {    throw new UnsupportedOperationException();}

3.AbstractSet继承AbstractCollection接口,没有重写add(E e)方法

4.EmytyList继承AbstractList,没有重写add方法


5. 返回线程安全的集合

线程安全、可读可写

// Object on which to synchronizefinal Object mutex;     //对元素的操作上锁public void add(int index, E element) {    synchronized (mutex) {list.add(index, element);}}
List<Object> list = new ArrayList<Object>();list.add("123");List<Object> synchronizedList = Collections.synchronizedList(list);System.out.println(synchronizedList);synchronizedList.add("hello");//输出结果:[123]System.out.println(synchronizedList);//输出结果:[123, hello]
阅读全文
0 0