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

    http://zctya.blog.163.com/blog/static/1209178201147105836319/

    List提供了toArray()的方法,但是要使用不好,就会有ClassCastException异常
    究竟这个是如何产生的,且看代码:

     
    首先咱们来看看下面的代码:
     ArrayList<String []> arr = new ArrayList<String []>();
     arr.add(new String[]{"a","b"});
     arr.add(new String[]{"c","d"});
     String [][] str_a  = (String[][]) arr.toArray();//这几行代码会有ClassCaseException异常
       
    执行上面这几行代码 会有ClassCaseException异常
     
    咱们再来看下面几行代码:
     ArrayList<String []> arr = new ArrayList<String []>();
     arr.add(new String[]{"a","b"});
     arr.add(new String[]{"c","d"});
     String [][] str_a  = (String[][]) arr.toArray(new String[0][0]);
       
    执行上面的代码就完全OK了
     
    会抛java.lang.ClassCastException。
    下面是ArrayList的两个toArray()方法的源代码:
     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; 
    }
      
    可以看出,不带参数的toArray()方法,是构造的一个Object数组,然后进行数据copy,此时进行转型就会产生ClassCastException
    而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object 数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常 
    正确的方式
    1. String[][] str_a = (String [][]) arr.toArray(new String[0][0]);

    2. String[][] a = new String[<size>][size];
        String [][] str_a = (String [][]) arr.toArray(a);
        这里要注意的是:你要是传入的参数为9个大小,而list里面有5个 object ,那么其他的四个会是 null , 使用的时候要注意。

     
     
    List<Object> paraList = new ArrayList<Object> ();
      paraList.add("String1");
      paraList.add("String2");
      paraList.add("String3");
      
      Object[] paras = (Object[])paraList.toArray(new Object[0] );
      
      System.out.println("paras:"+paras.length);
  • 相关阅读:
    WebView Android 调用js且须要获取返回结果
    推荐系统--揭开推荐的神奇面纱
    回调函数
    对CAB文件进行数字签名
    adodb.RecordSet的属性和方法
    Code Review中的几个提示
    Linux下find命令具体解释
    html5中关于input使用方法的改变
    关于 ioctl 的 FIONREAD 參数
    Grant的时候报错的解决:Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)
  • 原文地址:https://www.cnblogs.com/rattersnake/p/3077482.html
Copyright © 2011-2022 走看看