为什么Java的List具有“ List.toArray()”,而数组没有“ Array.toList()”?

时间:2018-12-24 02:32:29

标签: java arrays arraylist casting static

数组没有“ toList”函数,因此我们需要“ Arrays.asList”帮助函数进行转换。

这很奇怪:List拥有自己的函数来转换为数组,但是数组需要一些帮助函数才能转换为List。为什么不让数组具有“ toList”功能,这种Java设计背后的原因是什么?

非常感谢。

5 个答案:

答案 0 :(得分:5)

因为列表实例是一个实际的对象,而数组(出于MOST的目的和目的)是原始的,并且不公开方法。尽管从技术上讲数组是一个对象,它们可以如何拥有字段length和诸如clone()之类的方法调用,但是数组的类是由JVM编译后创建的。

答案 1 :(得分:2)

要考虑的另一点是,toArray()是在 INTERFACE (特别是 java.util.List 接口)上声明的。

因此,必须在实现List的某个对象实例上调用toArray()

这可能有助于解释问题的至少一部分:为什么它不是静态的...

答案 2 :(得分:2)

正如其他人指出的那样:Java中的数组是一个相当“低级”的构造。尽管它是Object,但它实际上并不是面向对象世界的一部分。对于引用数组,例如String[],这是正确的,但对于诸如int[]float[]这样的原始数组,则更是如此。这些数组是“原始的,连续的内存块”,在Java虚拟机内部具有直接表示。

从语言设计的角度来看,Java中的数组甚至可以被视为对C和C ++的致敬。有 种语言完全是面向对象的,不存在普通数组或原始类型,但Java并不是其中一种。

更具体地关注您的问题:

这里重要的一点是Arrays#asList不会进行任何转换。它仅创建List,它是数组上的视图。与此相反,Collection#toArray方法确实创建了一个新数组。我在this answer about the lists that are created with Arrays#asList中写了一些关于这种差异的含义的话。

此外,Arrays#asList方法仅适用于元素为引用类型(如String[])的数组。它不适用于像long[] *这样的 primitive 数组。但是幸运的是,有几种方法可以解决这个问题,我在this answer about how to convert primitive arrays into List objects中提到了其中的几种。


* 事实上,Arrays#asList 确实适用于像long[]这样的原始数组,但是它不会创建List<Long>,而是创建{{ 1}}。这通常是造成混乱的原因...

答案 3 :(得分:2)

从现代的角度来看,没有充分的理由说明数组缺少您提到的方法以及大量其他方法,这将使它们非常容易使用。唯一客观的原因是“它对22年前的Java设计师最有意义”。 1996年是另一番景象,在那个时代,C和C ++是主要的通用编程语言。

您可以将其与例如Kotlin,一种编译为与Java完全相同的字节码的语言。它的数组是功能齐全的对象。

答案 4 :(得分:-3)

数组是没有方法的原语(String除外),因此您必须使用另一个类中的方法。列表是引用类型,因此它可以具有方法。