美文网首页Java
[Java]重学Java-集合的视图

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

作者: AbstractCulture | 来源:发表于2022-04-13 14:47 被阅读0次

聊聊一些常用的视图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);

相关文章

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

    聊聊一些常用的视图API asList 很多时候,我们希望快速得到一个List,我们可能会这样写: 直接报错: 出...

  • [Java]重学Java-集合

    容器 很多时候,我们写程序需要进行批量的操作,比如说,新增一批学生列表.那么就需要有容器来装下这10个对象。Jav...

  • Hello Java

    目录 Java-基础(1/6) Java-对象(2/6) Java-核心库类 上(3/6) Java-核心库类下(...

  • [Java]重学Java-继承

    复用 随着码代码的时间增长,程序员会越发需要"复用"这个能力,比如最简单的对String类进行判空: 我们需要每次...

  • [Java]重学Java-接口

    接口是什么 首先接口不是类,它本身是无法被实例化的,只有实现类可以被实例化。它更像是一种功能的描述,程序输入什么值...

  • [Java]重学Java-多态

    从一个例子理解多态 对于一个不同特征的对象,使用接口可以隐藏子类的行为,对外暴露同一个接口,从而实现编程的解耦. ...

  • Java-集合

    Collection: 在Java类库中,集合类的基本接口是Collection接口,这个接口有两个基本方法: 迭...

  • JAVA-集合

    JAVA集合 Java集合是使程序能够存储和操纵元素不固定的一组数据。 JAVA中的集合是一个类似一个‘’容器‘’...

  • Java-集合

    List接口特点: 允许重复元素必须是有序的可以放入null元素 ArrayList特点 里面维护的是一个数组 默...

  • java-集合

    CollectionListSet泛型MapCollections Collecton1.1 集合知识回顾集合类的...

网友评论

    本文标题:[Java]重学Java-集合的视图

    本文链接:https://www.haomeiwen.com/subject/lmdasrtx.html