[英]Why does Java's List have “List.toArray()”, but arrays don't have “Array.toList()”?
數組沒有“toList”函數,因此我們需要“Arrays.asList”輔助函數來進行轉換。
這很奇怪:List有自己的函數轉換為數組,但是數組需要一些輔助函數來轉換為List。 為什么不讓數組具有“toList”函數,這個Java設計背后的原因是什么?
非常感謝。
因為List實例是一個實際的對象,而數組(對於MOST意圖和目的)是一個原語,並且不公開方法。 雖然從技術上講,數組是一個對象,它們可以使用字段length
和方法調用(如clone()
,但它們的類是在JVM編譯后創建的。
另一個需要考慮的問題是toArray()
是在INTERFACE (特別是java.util.List接口)上聲明的。
因此,您必須在實現List的某個對象實例上調用toArray()
。
這可能有助於解釋您問題的至少一部分:為什么它不是靜態的......
正如其他人所指出的:Java中的數組是一個相當“低級”的結構。 雖然它是一個Object
,但它並不是面向對象世界的一部分。 這對於引用數組(如String[]
來說是如此,但對於像int[]
或float[]
這樣的原始數組更是如此。 這些數組是“原始的,連續的內存塊”,它們在Java虛擬機中具有直接表示。
從語言設計的角度來看,Java中的數組甚至可以被視為對C和C ++的致敬。 但是也有一些純粹的面向對象的語言和地方普通陣列或基本類型是不存在的,但Java是不是其中之一。
更專注於您的問題:
這里很重要的一點是, Arrays#asList
不作任何轉換。 它只創建作為數組視圖的 List
。 與此相反, Collection#toArray
方法確實創建了一個新數組。 我在這個關於使用Arrays#asList
創建的列表的答案中寫了一些關於這種差異的含義的Arrays#asList
。
此外, Arrays#asList
方法僅適用於元素為引用類型的數組(如String[]
)。 它不適用於像long[]
*這樣的原始數組。 但幸運的是,有幾種方法可以解決這個問題,我在這個答案中提到了一些關於如何將原始數組轉換為List
對象的方法 。
* 事實上, Arrays#asList
不會像原始的陣列,而long[]
但它不會創建一個List<Long>
,但List<long[]>
這通常是混亂的根源......
從現代的角度來看,沒有充分的理由說明為什么數組缺少你提到的方法以及大量的其他方法,這將使它們更容易使用。 唯一客觀的原因是“二十二年前它對Java設計師最有意義”。 1996年是一個不同的領域,C和C ++是主要的通用編程語言。
您可以將其與例如Kotlin進行比較,Kotlin是一種編譯為與Java完全相同的字節碼的語言。 它的數組是功能齊全的對象。
數組是沒有方法的原語(String除外),因此你必須使用另一個類的方法。 列表是引用類型,因此它可以有方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.