为什么数组不被视为Collection的子类型?

时间:2016-03-28 19:01:28

标签: java arrays collections

有没有什么好的理由Java中的数组不扩展Collection?

在使用someObject instanceof Collection进行迭代之前,能够测试for (Object element : someObject)似乎很有用。相反,根据我的理解,了解对象是否为数组的唯一方法是在每个数组类型(instanceofObject[]int[]上使用double[], ...)或使用someObject.getClass().isArray()但当然这也会强制进行无效检查。

3 个答案:

答案 0 :(得分:0)

阵列比集合更低级;一些集合在数组上抽象(例如ArrayList或Vector),但是本机数组只是一个(受保护的,定义良好的)内存块,您可以在其上构建自己的抽象。

为什么这对你来说是一个问题?

foreach循环也可以在阵列BTW上运行,在这种情况下,它只是扩展为索引for表达式。

答案 1 :(得分:0)

Java中的数组是通过JVM中的专用指令实现的。它们是系统的独立一等成员,而不是传统意义上的类。它们必须是为了允许在数组上使用的专用语法。

有两种特殊情况:空引用和对基本数组的引用。

null引用会导致instanceof结果为false,而isArray会抛出NullPointerException

应用于基本数组时,instanceof结果为false,但isArray()返回true。

答案 2 :(得分:0)

实际上有很多原因。

  • 集合是类型安全的;数组不是。因为阵列"假"协方差,ArrayStoreException可以在运行时产生

  • 列表或集合的equals,hashCode和toString方法可以满足用户的期望;阵列上的那些方法可以做任何你想要的事情 - 一个常见的错误来源。

  • 集合可以是线程安全的;甚至并发。发布到多个线程的数组永远不会安全。

  • 集合可以是可变的或不可变的。非空数组必须始终是可变的。

有关详细信息,请参阅:https://stackoverflow.com/a/6105705/1691223