黑马程序员技术交流社区

标题: 集合转变成数组的问题(ArrayList的toArray()) [打印本页]

作者: 孙汇川    时间: 2012-2-20 12:05
标题: 集合转变成数组的问题(ArrayList的toArray())
本帖最后由 孙汇川 于 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()]参数呢?
作者: 杜明辉    时间: 2012-2-20 12:33
你的这段代码,我看明白了。。
首先,你建立了一个al 的arrayList的集合。
然后用add方法,往里面添加了对象。

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

还有什么问题??
作者: 孙汇川    时间: 2012-2-20 13:56
杜明辉 发表于 2012-2-20 12:33
你的这段代码,我看明白了。。
首先,你建立了一个al 的arrayList的集合。
然后用add方法,往里面添加了对 ...

我问的是toArray()里面的new String[al.size()]是干嘛的?我知道al.size()是取集合al的长度的,new String[]干嘛用的?不new不行吗?
作者: 刘丁    时间: 2012-2-20 14:13

在没有指定范型时 toArray()返回的是Object数组这时就不能用String[] 数组去接收一个Object类型的数组
而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,

作者: 王康    时间: 2012-2-20 14:26
打开 JDK API
java.util
        List
                ArrayList ---toArray(T[] a)  //按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
                       

作者: 【专】【属】    时间: 2012-2-20 14:28
个人感觉是由于有泛型的存在,所以编辑器就可以确定方法所返回的数组的类型。
作者: 孙汇川    时间: 2012-2-20 15:05
王康 发表于 2012-2-20 14:26
打开 JDK API
java.util
        List

API是万能的话我就不来论坛了~~~你看我写的问题就应该知道我看过API了,但是没明白是什么意思啊~~
作者: 王康    时间: 2012-2-20 16:26
孙汇川 发表于 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类型.
这样,就类型才会匹配.

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2