• java数组转换为集合-Arrays.asList使用


    在日常开发中,经常遇到需要将动态增加数组数据的情况,但是java中的数组的定义如下:

    Java语言中提供的数组是用来存储固定大小同类型元素。(菜鸟教程)

    也就是说,数组在声明时就是固定长度,不可增加或者减少它的长度的。那么当我们的确需要动态修改长度应该如何去处理,这时候就应该用到List集合了。 将数组转换为集合有以下两种方式

    1. 声明一个List集合,遍历数组,将数组中的每一个元素添加到List集合中

    import java.util.ArrayList;
    import java.util.List;
    
    public class ArraysDemo {
    	public static void main(String[] args) {
    		String[] strArray = {"a","b"};
    		List<String> strList = new ArrayList<>(strArray.length);
    		for (String str : strArray) {
    			strList.add(str);
    		}
    		strList.add("c");
    		strList.add("d");
    		for (String str : strList) {
    			System.out.println(str);
    		}
    	}
    }
    

    2. 使用java提供的类Arrays.asList方法,可以将数组转换为集合

    public class ArraysDemo {
    	public static void main(String[] args) {
    		String[] strArray = {"a","b"};
    		List<String> asList = Arrays.asList(strArray);
    		// 此处会报异常
    		asList.add("e");
    		for (String str : asList) {
    			System.out.println(str);
    		}
    	}
    }
    

    但是当我们转换了之后,需要动态修改这个集合时就发现问题了。

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

    在此我们查看一下Arrays.asList(T... a)的源码,可以发现这个方法返回的类是这个java.util.Arrays.ArrayList.ArrayList<T>,是Arrays下的内部类,而不是java.util.ArrayList,它继承了AbstractList但是并没有实现像ArrayList中的添加和删除方法,当调用add方法时会抛出异常UnsupportedOperationException()

    // asList方法的函数体
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
    
    // 当前的ArrayList是Arrays下的私有内部类
    private static class ArrayList<E> extends AbstractList<E>
            implements RandomAccess, java.io.Serializable
        {
        // 省略类的实现代码...
        }
    

    解决方法

    我们可以将这个转换后的集合作为参数传给声明的List中 这时候就可以使用List中的添加和删除方法了。

    public class ArraysDemo {
    	public static void main(String[] args) {
    		String[] strArray = {"a","b"};
    		List<String> asList = new ArrayList<>(Arrays.asList(strArray));
    		asList.add("e");
    		for (String str : asList) {
    			System.out.println(str);
    		}
    	}
    }

    才疏学浅,如文中有错误,感谢大家指出。 

  • 相关阅读:
    Day 18
    Day 17
    Day 16
    Day 15
    Day 14
    Day 13
    Day 12
    Day 11
    Day 10
    《ES6标准入门》(阮一峰)--2.let 和 const 命令
  • 原文地址:https://www.cnblogs.com/runningRookie/p/14348232.html
Copyright © 2020-2023  润新知