A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李节起 中级黑马   /  2012-4-10 23:05  /  1855 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. ArrayList<String> al = new ArrayList<String>();

  2.                 al.add("abc1");
  3.                 al.add("abc2");
  4.                 al.add("abc3");
  5.                
  6.         String[] arr = al.toArray(new String[al.size()]);
复制代码
ArrayList类有个方法是toArray()和<T> T[] toArray(T[] a ),
在做转换时是ArrayList对象调用方法,对这个集合对象本身进行toArray操作,为什么要在toArray函数里面传new String[al.size()]参数呢?
这里new有什么意义?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

1 个回复

倒序浏览
本帖最后由 曾晓文 于 2012-4-10 23:45 编辑

因为这里调用的ArrayList集合的toArray方法需要接收一个数组的方法,<T> T[]  toArray(T[] a)。所以在调用该方法是需要把存放 从ArrayList集合转为数组的元素。一种是先创建String数组对象,再把引用传到方法去:al.toArray(strs);
String[] strs = new String[al.size()];
String[] arr = al.toArray(strs);
另一种:在调用的时候在参数类表上new String数组对象。其实质和前一中方式是一样的,也是要在堆内存里new 一个String数组对象,然后把读写地址传给toArray方法。完了之后toArray方法返回刚才匿名String数组的引用。String[] arr = al.toArray(new String[al.size()]);

<T> T[]  toArray(T[] a)的源代码:
public <T> T[] toArray(T[] a) {//a接收传进来的数组引用
        if (a.length < size)
            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方法:方法内部帮我们new 了一个String数组对象,然后把它创建的对象引用返回给我们。所以不要再传数组进去。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马