Java List toArray(T [] a)实现

Osc*_*mez 11 java generics list toarray

我只是在查看List接口中定义的方法:

以正确的顺序返回包含此列表中所有元素的数组; 返回数组的运行时类型是指定数组的运行时类型.如果列表适合指定的数组,则返回其中.否则,将使用指定数组的运行时类型和此列表的大小分配新数组.如果列表适合指定的数组,并且空间足够(即,数组的元素多于列表),则紧跟集合结尾的数组中的元素将设置为null.仅当调用者知道列表不包含任何null元素时,这在确定列表长度时很有用.

<T> T[] toArray(T[] a);
Run Code Online (Sandbox Code Playgroud)

而我只是想知道为什么它以这种方式实现,基本上如果你传递一个长度为<listTeize()的数组,它只会创建一个新的并返回它.因此,在方法参数中创建新的Array对象是没用的.

另外,如果你使用列表的大小传递一个足够长的数组,如果返回与对象相同的对象 - 返回它真的没有意义,因为它是同一个对象但是为了清晰起见.

问题是我认为这会促使代码效率稍低,在我看来,Array应该只是接收类并只返回带有内容的新数组.

有没有理由说它没有这样编码?

dfb*_*dfb 6

  357       public <T> T[] toArray(T[] a) {
  358           if (a.length < size)
  359               // Make a new array of a's runtime type, but my contents:
  360               return (T[]) Arrays.copyOf(elementData, size, a.getClass());
  361           System.arraycopy(elementData, 0, a, 0, size);
  362           if (a.length > size)
  363               a[size] = null;
  364           return a;
  365       }
Run Code Online (Sandbox Code Playgroud)

也许所以它有一个运行时类型?

来自维基:

因此,实例化参数化类型的Java类是不可能的,因为实例化需要调用构造函数,如果类型未知则该构造函数不可用.

  • 仍然没有理由他们不只是传递一个类参数并使用它而不是a.getClass().但是,如果有人传递数组<size并且为什么会这样做呢? (3认同)

RHS*_*ger 5

正如其他人所说,有几个不同的原因:

  • 你需要以某种方式传入类型,并且传入指定类型的数组并不是一种不合理的方法.不可否认,如果有一个版本可以传递给你想要的类型的类,那么速度可能会很好.
  • 如果要重用数组,可以继续传递相同的数组,而不是每次都需要创建一个新数组.如果您需要多次执行此操作,这可以节省时间和内存以及GC问题