美文网首页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-集合的视图

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