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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙汇川 黑马帝   /  2012-2-20 12:05  /  4520 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙汇川 于 2012-2-21 12:50 编辑

ArrayList类有个方法是toArray()和<T> T[] toArray(T[] a ),
在做转换时是ArrayList对象调用方法,对这个集合对象本身进行toArray操作,为什么还要传参数呢?

例如:
  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()]);

复制代码
为什么要在toArray函数里面传new String[al.size()]参数呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

10 个回复

倒序浏览
你的这段代码,我看明白了。。
首先,你建立了一个al 的arrayList的集合。
然后用add方法,往里面添加了对象。

String[] arr = al.toArray(new String[al.size()]);
建立了一个String类型的arr数组,然后把集合里面的元素转换成这个数组,并且指定长度为这个集合存放元素的个数。

还有什么问题??

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
杜明辉 发表于 2012-2-20 12:33
你的这段代码,我看明白了。。
首先,你建立了一个al 的arrayList的集合。
然后用add方法,往里面添加了对 ...

我问的是toArray()里面的new String[al.size()]是干嘛的?我知道al.size()是取集合al的长度的,new String[]干嘛用的?不new不行吗?
回复 使用道具 举报

在没有指定范型时 toArray()返回的是Object数组这时就不能用String[] 数组去接收一个Object类型的数组
而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,
回复 使用道具 举报
打开 JDK API
java.util
        List
                ArrayList ---toArray(T[] a)  //按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
                       
回复 使用道具 举报
个人感觉是由于有泛型的存在,所以编辑器就可以确定方法所返回的数组的类型。
回复 使用道具 举报
孙汇川 黑马帝 2012-2-20 15:05:11
7#
王康 发表于 2012-2-20 14:26
打开 JDK API
java.util
        List

API是万能的话我就不来论坛了~~~你看我写的问题就应该知道我看过API了,但是没明白是什么意思啊~~
回复 使用道具 举报
王康 黑马帝 2012-2-20 16:26:52
8#
孙汇川 发表于 2012-2-20 15:05
API是万能的话我就不来论坛了~~~你看我写的问题就应该知道我看过API了,但是没明白是什么意思啊~~ ...

打开JDK API
ArrayList含有如下两个方法
Object[] toArray()
          按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
<T> T[]
toArray(T[] a)
          按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
a1是ArrayList集合类型,a1.toArray();返回的是Object[]类型的数组
而你声明的是 String[] 类型的数组
String[] arr = Object[]; 你觉得可有错误?肯定是类型转换错误啊!
而String[] arr = al.toArray(new String[al.size()]); 其中al.toArray(new String[al.size()])返回的类型则和里面的参数new String[a1.size]的类型一致,即String类型.
这样,就类型才会匹配.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
刘基军 黑马帝 2012-2-20 16:40:12
9#
Object[] toArray()
          按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
<T> T[]
toArray(T[] a)
          按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型//就是为了可以自己定义需要的类型。
回复 使用道具 举报
孙汇川 发表于 2012-2-20 13:56
我问的是toArray()里面的new String[al.size()]是干嘛的?我知道al.size()是取集合al的长度的,new S ...

那我问你 数组会建不??
String[] arr = new String[(指定长度)];
这么说 你明白了没??
回复 使用道具 举报
楼主,我查了下API发现toArray是toArray方法是数组通向集合的桥梁..那么有了一个toArray(),为何要加一个带参数的toArray(T[] a)呢?
第一个toArray(),是将原集合转换为相应的数组,,这样就防止了他人对集合数据的增删操作....它没有泛型,返回的是集合中所有的对象的集合,
;所有不具有针对性,,,,对于一个存储了多种不同类型的集合,我们往往需要的是一个限定类型的数组,而不是原集合..所以加泛型的toArray(T[] a)就
出现了,另外由于返回的是Object类型的数组,,,使用的时候还要进行强制转换,所有很不爽,,
泛型好像是1.5之后才出现的吧,,那么toArray()就是老版本的,,新版本的toArray(T[]  a)里面接收一个泛型T类型的数组对象,,你上面的泛型为String,,所
以传入的就是String数组啊,,,这样说可以么

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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