当前位置: 首页 > 面试题库 >

Java列表 T [] toArray(T [] a)实现

东门楚
2023-03-14
问题内容

我只是在查看List接口中定义的方法:<T> T[] toArray(T[] a)
,我有一个问题。为什么是通用的?因此,方法不是完全类型安全的。以下代码片段可编译但会导致ArrayStoreException

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);

String[] stringArray = list.toArray(new String[]{});

在我看来,如果toArray不是通用的并且采用List类型参数,那会更好。

我已经写了玩具示例,没有通用就可以了:

package test;

import java.util.Arrays;

public class TestGenerics<E> {
    private Object[] elementData = new Object[10];
private int size = 0;

    public void add(E e) {
    elementData[size++] = e;
}

@SuppressWarnings("unchecked")
    //I took this code from ArrayList but it is not generic
public E[] toArray(E[] a) {
    if (a.length < size)
        // Make a new array of a's runtime type, but my contents:
        return (E[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

    public static void main(String[] args) {

    TestGenerics<Integer> list = new TestGenerics<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    //You don't have to do any casting
    Integer[] n = new Integer[10];
    n = list.toArray(n);
}
}

有什么理由可以这样声明


问题答案:

从javadocs:

与toArray()方法一样,此方法充当基于数组的API和基于集合的API之间的桥梁。此外,此方法允许对输出数组的运行时类型进行精确控制,并且在某些情况下可以用于节省分配成本。

这意味着程序员可以控制它应该是哪种类型的数组。

例如,对于您的ArrayList<Integer>而不是Integer[]数组,您可能想要一个Number[]Object[]数组。

此外,该方法还会检查传入的数组。如果传入的数组具有足够的空间容纳所有元素,则该toArray方法将重用该数组。这表示:

Integer[] myArray = new Integer[myList.size()];
myList.toArray(myArray);

要么

Integer[] myArray = myList.toArray(new Integer[myList.size()]);

与…具有相同的效果

Integer[] myArray = myList.toArray(new Integer[0]);

注意,在较旧的Java版本中,后一个操作使用反射来检查数组类型,然后动态构造正确类型的数组。首先,通过传递大小正确的数组,不必在toArray方法内部使用反射来分配新的数组。情况不再如此,并且两个版本可以互换使用。



 类似资料:
  • 问题内容: 我只是在查看List接口中定义的方法: 返回以正确顺序包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果列表适合指定的数组,则将其返回。否则,将使用指定数组的运行时类型和此列表的大小分配一个新数组。如果列表适合指定的数组并有剩余空间(即,数组中的元素多于列表),则紧接集合结束后的数组中的元素设置为null。仅当调用者知道列表不包含任何null元素时,这才对确定

  • 我一直在学习如何使用java编程,但我还没有明确解释的和方法的区别。第二个只是将LinkedList对象中的所有元素作为数组返回,对吗?但是,第一个呢? 编辑: 我的意思是,我从甲骨文中阅读了文档,它说: 返回一个数组,其中包含此列表中所有元素的正确顺序(从第一个元素到最后一个元素);返回数组的运行时类型是指定数组的运行时类型。如果列表适合指定的数组,则返回该数组。否则,将使用指定数组的运行时类型

  • 我有一些包含这个hashmap的代码(为了简化,我删除了除5对之外的所有代码): 我试图提取的颜色,使一个单一的数组与他们都与这条线: 但Processing(3.5.4)IDE拒绝接受这一点,并用,尽管其正字法与我在网上找到的几个资源相同。我该怎么做?

  • 面试官表述特别清晰,是那种会担心我没有听懂题目的程度。 一、算法与数据结构 面:平时刷题多吗? 答:不多。【笑话,我哪敢说多】 题目:LC13. 罗马数字转整数。 【本菜鸡看到这题紧张得要死,不知道该用啥。最后用了十多个 if else,真的很想死!凉透了!!】 二、Java 基础 > 感觉面试官用的是一套可以用来问很多面试者的题,宽度比较广,深度不咋深。 1. == 和 equals 有什么区别

  • 问题内容: 我试图学习Java泛型,并发现以下代码。 哪个没有问题。 但是,当我将方法更改为以下内容时,它给了我编译错误。 错误: 谁能帮助我了解错误? 问题答案: 您应该了解的第一件事是,使用以下方法签名 双方 必须 是同一类型,也就是既和将具有相同infered类型。 那么,为什么它的工作和?因为这两个参数实际上可以表示为,这是最近的公用超类型和: 实现接口。 可以装进一个盒子,也可以。 因此

  • 问题内容: 我对方法的使用有疑问。 想象以下代码: 有任何理由为什么你应该使用而不是(反之亦然)。我认为第二个选项更具可读性(当然是个人喜好了)。但是,有没有“真正的”理由为什么应该优先考虑呢? 问题答案: 从当前的JRE实现开始,将始终返回相同的实例,而每次出现不仅会创建自己的实例,甚至还会具有不同的实现类。有关更多详细信息,请参见此处。 原因是编译器生成了一个合成方法,该方法保留了该表达式的琐