为了账号安全,请及时绑定邮箱和手机立即绑定

当使用toArray()方法[保持]时,String的大小如何自动增加

当使用toArray()方法[保持]时,String的大小如何自动增加

尚方宝剑之说 2019-04-26 22:15:17
我试图使用T [] toArray(T [] obj)将arrayList转换为数组。我传递的大小为0的字符串数组小于arrayList的大小。它应该抛出ArrayIndexOutOfBoundsException,但它正常工作并打印所有元素。字符串数组大小如何增加?ArrayList<String> al=new ArrayList<>();al.add("a");al.add("b");al.add("c");String[] str=al.toArray(new String[0]);*//passing a string object of size 0*for(String ele: str){    System.out.println(ele);*//prints every elements in the arraylist*}预期结果:线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常
查看完整描述

4 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

我不知道为什么你认为它应该抛出ArrayIndexOutOfBoundsException,因为文档说不然:

如果列表适合指定的数组,则返回其中。否则,使用指定数组的运行时类型和此列表的大小分配新数组


查看完整回答
反对 回复 2019-05-15
?
Qyouu

TA贡献1786条经验 获得超11个赞

你应该阅读文档

toArray(T[]):以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素)

参数:a - 要存储此列表元素的数组(如果它足够大); 否则,为此目的分配相同运行时类型的新数组。

因此,返回的数组始终包含列表的所有元素,因为如果传递的数组小于列表的大小,则会创建新数组。

如果您需要创建一个只包含部分元素的数组,您可以使用List.subList()

String[] array = list.subList(0, 3).toArray(new String[3]);


查看完整回答
反对 回复 2019-05-15
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

这是因为toArray()如有必要,会调整它的大小:

@SuppressWarnings("unchecked")
    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;
    }

请注意该部分if (a.length < size)Array如果您传递的部分不够大,它将调整大小。因此,最好写一下:

String[] str=al.toArray(new String[al.size()]);


查看完整回答
反对 回复 2019-05-15
?
跃然一笑

TA贡献1826条经验 获得超6个赞

来自文档

以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素); 返回数组的运行时类型是指定数组的运行时类型。如果列表适合指定的数组,则返回其中。否则,将使用指定数组的运行时类型和此列表的大小分配新数组。


换句话说,如果元素不适合给定的元素,它会创建一个新数组。


查看完整回答
反对 回复 2019-05-15
  • 4 回答
  • 0 关注
  • 806 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信