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

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 synchronize
final 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]

————————————————
版权声明:本文为CSDN博主「qy_get_busy_living」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36787384/article/details/77116042

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值