[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
返回的是不可修改的视图对象,不可以进行add
和remove
操作.
Arrays定义的是一个内部类ArrayList
并继承AbstractList
,但是它并没有重写add
和remove
,所以会触发以下的异常:
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
.也是没有重写add
和remove
.
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);