黑马程序员技术交流社区

标题: 关于List的问题 [打印本页]

作者: as_heima    时间: 2014-8-8 20:35
标题: 关于List的问题
本帖最后由 as_heima 于 2014-8-13 23:05 编辑

Integer[] b = list.toArray(new Integer[0]) 这句话不是很了解,查了API也没懂!求大神讲解下~
作者: wisely    时间: 2014-8-8 20:57
这句代码很绕       Integer[] b=list.toArray(new Integer[0])

不过这个写法感觉很厉害的样子。

=右边:估计前面的代码中有一个List集合的对象,list.toArray(new Integer[0]),这是调用了List中的一个方法,在API的最后,它将list集合中的元素全部存入匿名数组中,也就是new Integer[0]中。不过这个数组的长度为0,所以啥也没存下。toArray方法的返回值就是一个数组,这里返回的应该是Intger类型的数组,长度为0

我猜想楼主大人的代码可能抄写的有些错误,应该是下面这样的吧。
Integer[] b=list.toArray(new Integer[list.size()])
作者: 杨庆雷    时间: 2014-8-8 21:14
list.toArray(),返回的是一个Object类型的数组,就需要传入参数new Integer[0],返回数组的运行时类型是Integer,意思就是把把list转变为Integer类型的数组
其中的 0  就是数组开辟的长度,如果数组不足以装下 list,就自己增加长度,但是如果集合只有4个元素,定义的数组长度为5,那么数组的最后一个值就是null。所以一般就定义长度为list.size();

Integer[] b = list.toArray(new Integer[list.size()])
作者: as_heima    时间: 2014-8-8 21:20
wisely 发表于 2014-8-8 20:57
这句代码很绕       Integer[] b=list.toArray(new Integer[0])

不过这个写法感觉很厉害的样子。

首先感谢大神的回答,代码错没错,因为我没看懂所以不敢断言,但是运行结果没错
作者: as_heima    时间: 2014-8-8 21:39
杨庆雷 发表于 2014-8-8 21:14
list.toArray(),返回的是一个Object类型的数组,就需要传入参数new Integer[0],返回数组的运行时类型是Int ...

谢谢,好像刚刚懂一点点0.0
作者: as_heima    时间: 2014-8-8 21:51
杨庆雷 发表于 2014-8-8 21:14
list.toArray(),返回的是一个Object类型的数组,就需要传入参数new Integer[0],返回数组的运行时类型是Int ...

new Integer[0],请问toArray的参数都可以放什么?
作者: wisely    时间: 2014-8-8 22:00
本帖最后由 wisely 于 2014-8-8 22:01 编辑
as_heima 发表于 2014-8-8 21:51
new Integer[0],请问toArray的参数都可以放什么?

数组,任意对象的数组。
PS:是对象的数组,基本类型的数组不行。因为List带泛型,所以泛型是什么类型,它就是什么类型。如果不带泛型,就是Object类型。

作者: Justfeeling    时间: 2014-8-8 22:13
学习来了。。。
作者: as_heima    时间: 2014-8-8 22:20
wisely 发表于 2014-8-8 22:00
数组,任意对象的数组。
PS:是对象的数组,基本类型的数组不行。因为List带泛型,所以泛型是什么类型,它 ...

先谢谢,你的回答我暂时没全看懂,得消化消化........
作者: 李林_    时间: 2014-8-9 00:35
   public <T> T[] toArray(T[] 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;
    }
你可以看看这个 底层实现原理

作者: sunshine9091    时间: 2014-8-9 06:52
学习了!
作者: as_heima    时间: 2014-8-9 08:05
李林_ 发表于 2014-8-9 00:35
public  T[] toArray(T[] a) {      
        if (a.length < size)
            return (T[]) Arrays.c ...

:funk: 完全没看懂....这个底层实现~能否配合讲解一下..
作者: 李林_    时间: 2014-8-9 12:10
本帖最后由 李林_ 于 2014-8-9 12:41 编辑

public <T> T[] toArray(T[] a) {      //  方法中含有<T>代表是泛型方法  这个<>可以任意写  
                                                    //但后面要一样 这个T指任意     Integer[] b=list.toArray(new Integer[0])
        if (a.length < size)               //a.length  就不用说了吧    size 是ArrayList类里的一个属性在构造 public ArrayList(Collection<? extends E> c) 赋值
       return (T[]) Arrays.copyOf(elementData, size, a.getClass());   //这是个拷贝方法  参数一1是要拷贝的数组  参数2 要拷贝的长度  参数3是要拷贝的类文件
        System.arraycopy(elementData, 0, a, 0, size);    //这也是一个拷贝方法   参数1 原数组 参数2原数组的起始位置  参数3  目标数组  参数4目标数组中起始位置                                               参数5要拷贝的长度
                                                                                   
        if (a.length > size)
            a[size] = null;
        return a;
    }
现在看不懂也没关系   以后学的更深入了就看的懂了

作者: as_heima    时间: 2014-8-10 22:38
李林_ 发表于 2014-8-9 12:10
public  T[] toArray(T[] a) {      //  方法中含有代表是泛型方法  这个可以任意写  
                    ...

谢谢你的注释:)
作者: 李林_    时间: 2014-8-12 15:01
没事  一起学习





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