这里我有一个 ArrayList List<String> list,我想将它转换为一个数组String[]
所以我检查了ArrayListAPI,得到了一个方法toArray(T[] a),唯一一个具有泛型类型的方法。
我想知道为什么ArrayList下面没有这样的方法?
public <T> T[] toArray(Class<T[]> type) {
return Arrays.copyOf(elementData, size, type);
}
Run Code Online (Sandbox Code Playgroud)
所以我只是在list.toArray(String[].class)不创建新数组的情况下调用它。它工作我尝试它,我认为它更简单。
当然,也许我没有得到作者关于ArrayList.toArray.
所以想请大家指出我的错误或分享我原始方法的优点toArray(T[] a)。谢谢!:)
因为该方法早于泛型。
回到 Java 1.2 创建方法时,它被声明为:
public Object[] toArray(Object[] a)
Run Code Online (Sandbox Code Playgroud)
然后调用者可以创建正确类型的数组,例如String[],并转换返回值。如果数组足够大,则不需要反射来重新调整数组大小,因此性能更好。
从那时起,Java 的性能前景发生了巨大的变化,因此在设计中完成的一些性能考虑现在似乎是不必要的。
设计者还补充说,null如果数组过大,就在列表中的最后一个元素之后立即添加元素,这是一种奇怪的类似 C 的怪癖。我怀疑如果现在设计这种方法会发生这种情况。
当泛型在Java 5中加入一些类被改为通用的,比如所有的集合类,所有的现有方法发生了变化,尽可能以适应。某些方法可以更改以实现向后兼容性,例如Map.get(Object key)未更改为 ,Map.get(K key)因为以前get()使用无法在地图中的对象进行调用是有效的。
该toArray方法已更改,因为即使更改后它仍然完全向后兼容:
public <T> T[] toArray(T[] a)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |