zoukankan      html  css  js  c++  java
  • ArrayList.toArray()用法详解

    1. API

    Object[] toArray()

    按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

    T[] toArray(T[] a)

    按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

    2. 源码

        public Object[] toArray() {
            return Arrays.copyOf(elementData, size);
        }
    
        public <T> T[] toArray(T[] a) {
            if (a.length < size)
                // Make a new array of a's runtime type, but my contents:
                return (T[]) Arrays.copyOf(elementData, size, a.getClass());
            System.arraycopy(elementData, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }
    

    3. 用法

    当使用ArrayList时,有时想获得一个实际的数组,这个数组包含了列表的内容。
    可以通过调用方法toArray()来实现。

    示例:

    		List<Integer> list = new ArrayList<>();
    		for (int i = 0; i< 10; i++) {
    			list.add(i);
    		}
    		System.out.println("List<Integer> 类型对象:");
    		System.out.println(list);
    		System.out.println();
    		
    		System.out.println("Object[] 类型对象:");
    		Object[] integerObjs = list.toArray();
    		System.out.println(Arrays.toString(integerObjs));
    		System.out.println();
    		
    		System.out.println("Integer[] 类型对象: ");
    		Integer[] integers = list.toArray(new Integer[list.size()]);
    		System.out.println(Arrays.toString(integers));
    		System.out.println();
    		
    		System.out.println("int[] 类型对象:");
    		int[] ints = new int[list.size()];
    		for (int i = 0; i < list.size(); i++) {
    			ints[i] = list.get(i);
    		}
    		System.out.println(Arrays.toString(ints));
    

    输出:

    List<Integer> 类型对象:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    Object[] 类型对象:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    Integer[] 类型对象: 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    int[] 类型对象:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    4. 总结

    可以看出,不带参数的toArray()方法,是构造的一个Object数组,然后进行数据copy,此时进行转型就会产生ClassCastException

    而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object 数组的形式返回结果,不过由于构造数组使用的组件类型跟需要转型的组件类型一致,就不会产生转型异常。

    正确方法:

    1. String[] str_a = (String []) arr.toArray(new String[0]);
    
    2. String[] a = new String[size];
    String [] str_a = (String []) arr.toArray(a);
    
  • 相关阅读:
    fedora 27
    Python3 字符串操作
    python3 使用matplotlib画图问题
    Python3 移动文件——合集
    MySQL开放外部链接
    python之csv操作问题
    Question
    17-12-21
    python之List排序
    ubuntu版的sublime-text3输入中文问题
  • 原文地址:https://www.cnblogs.com/echoing/p/9379424.html
Copyright © 2011-2022 走看看