zoukankan      html  css  js  c++  java
  • Java Arrays.asList的三个坑

    坑1,用Array.asList转换基础类型数组

    代码

    @Slf4j
    public class ArrayAsListDemo {
        public static void intArrayToList() {
    
            int[] arr = {1, 2, 3};
            List list = Arrays.asList(arr);
            log.info("list:{} size:{} class:{}", list, list.size(), list.get(0).getClass());
        }
    }

    结果

    list:[[I@78cb5849] size:1 class:class [I

    size是1...

    分析

    asList一模版T作为参数

    上面的代码其实是等于

     所以返回的list只有一个元素,是一个int数组,有三个元素。如下。

     log.info(""+ list.get(0).length);//结果是3

    结论

    不能直接使用 Arrays.asList 来转换基本类型数组

    坑2,Arrays.asList 返回的 List 不支持增删操作

    代码

        public static void putAndRemove() {
            String[] arr = {"1", "2", "3"};
            List<String> list = Arrays.asList(arr);
            try {
                list.add("4");
    
            } catch (UnsupportedOperationException ex) {
                log.info("add failed");
            }
    
            try {
                list.remove("1");
    
            } catch (UnsupportedOperationException ex) {
                log.info("remove failed");
            }
        }

    结果

    add failed
    remove failed

    分析

    Arrays.asList返回的ArrayList是Array内部的ArrayList

    private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable

    但是AbstractList内部的add和remove没有实现,ArrayList,没有重写add和remove

     

    坑3,对原始数组的修改会直接影响得到的list

    代码

        public static void modifyOriginal() {
            String[] arr = {"1", "2", "3"};
            List<String> list = Arrays.asList(arr);
            log.info("list 0 before modify: "+list.get(0));
    
            arr[0]="aaaaa";
    
            log.info("list 0 after modify: "+list.get(0));
    
        }

    结果

    list 0 before modify: 1
    list 0 after modify: aaaaa

    分析

    asList生成的那个Array内部的ArrayList内部直接使用了原始的array导致的,这估计也是不让生成的list add和remove的原因吧,因为这样会影响到原始值。

  • 相关阅读:
    如何在一个for语句中迭代多个对象(2.7)
    yield列表反转 islice切片(2.6)
    yield和生成器, 通过斐波那契数列学习(2.5)
    python实现线程池(2.4)
    LOJ 3120: 洛谷 P5401: 「CTS2019 | CTSC2019」珍珠
    瞎写的理性愉悦:正整数幂和与伯努利数
    bzoj 3328: PYXFIB
    LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
    洛谷 P5345: 【XR-1】快乐肥宅
    LOJ 3089: 洛谷 P5319: 「BJOI2019」奥术神杖
  • 原文地址:https://www.cnblogs.com/Brake/p/12731888.html
Copyright © 2011-2022 走看看