Java

[Java]重学Java-集合的视图

2022-04-13  本文已影响0人  AbstractCulture

聊聊一些常用的视图API

asList

很多时候,我们希望快速得到一个List,我们可能会这样写:

List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.add(4);

直接报错:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)

出现报错的原因就是,Arrays.asList返回的是不可修改的视图对象,不可以进行addremove操作.
Arrays定义的是一个内部类ArrayList并继承AbstractList,但是它并没有重写addremove,所以会触发以下的异常:

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

singleton

这里我们使用singletionList来包装1这个数字,返回一个只包含一个元素的List.

List<Integer> one = Collections.singletonList(1);
one.add(2);

直接报错:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)

看了看源码,发现其中也是声明的内部类SingletonList继承自AbstractList.也是没有重写addremove.

empty

有时候我们可能会在接口返回一个空的集合,使用的是empty这类api,这个时候要注意,是不可以对返回的集合进行修改的,只提供访问功能。

List<String> emptyList = Collections.emptyList();
emptyList.add("null");  

返回的是内部类EmptyList.

subList

子视图通常用于截取一个List某个范围内的元素.

List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
List<Integer> subList = numbers.subList(0, 3);
subList.forEach(System.out::println);
1
2
3

这里注意,0是起始index,3是终止index,但是输出的元素并不包含number.get(3),也就是说,是左包含右不包含的关系。
如果对子视图执行clear操作,会将原本的列表中的元素清除.

List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
List<Integer> subList = numbers.subList(0, 3);
subList.forEach(System.out::println);
subList.clear();    
System.out.println("numbers中的元素:");
numbers.forEach(System.out::println);
1
2
3
numbers中的元素:
4
5

如何规避UnsupportedOperationException

使用Guava包来增强你的JDK。

List<Integer> targetList = Lists.newArrayList(1,3,5);
上一篇下一篇

猜你喜欢

热点阅读