有没有什么好的理由Java中的数组不扩展Collection?
在使用someObject instanceof Collection
进行迭代之前,能够测试for (Object element : someObject)
似乎很有用。相反,根据我的理解,了解对象是否为数组的唯一方法是在每个数组类型(instanceof
,Object[]
,int[]
上使用double[]
, ...)或使用someObject.getClass().isArray()
但当然这也会强制进行无效检查。
答案 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