ArrayList.toArray()的用法

当使用ArrayList时,有时想获得一个实际的数组,这个数组包含了列表的内容。

  可以通过调用方法toArray()来实现。

  示例:

  package bo;

  import java.util.ArrayList;

  public class ToArrayTest {

  /**

  * @param args

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  ArrayList<Integer> al = new ArrayList<Integer>();

  al.add(new Integer(1));

  al.add(new Integer(2));

  al.add(new Integer(3));

  al.add(new Integer(4));

  al.add(new Integer(5));

  System.out.println("al中元素:" + al);

  //获得数组

  Object ia[] = al.toArray();

  //遍历数组

  for(int i=0; i<ia.length; i++){

  System.out.println(ia + " ");

  }      

  }

  }

  运行结果:

  al中元素:[1, 2, 3, 4, 5]

  1

  2

  3

  4

  5

  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 , 使用的时候要注意。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值