【问题标题】:Why are arrays not considered a subtype of Collection? [duplicate]为什么数组不被视为 Collection 的子类型? [复制]
【发布时间】:2016-03-28 19:01:27
【问题描述】:

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

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

【问题讨论】:

  • 简短回答:数组早于集合,从长远来看。
  • “为什么语言设计者做出决定 X” 形式的问题实际上是基于意见的。唯一的具体答案可以在语言规范中找到(如果作者解释了他们的选择)或直接询问设计者。在这种情况下,很可能希望以一种并不令人惊讶的方式适应现有概念。
  • 空检查有什么问题?或者,更好的是,让someObject.getClass().isArray() 抛出NullPointerException 有什么问题?

标签: java arrays collections


【解决方案1】:

数组比集合更底层;一些集合对数组(例如 ArrayList 或 Vector)进行抽象,但本机数组只是一个(受保护的、定义明确的)内存块,您可以在其上构建自己的抽象。

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

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

【讨论】:

    【解决方案2】:

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

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

    空引用将导致 instanceof 结果为 false,而 isArray 抛出 NullPointerException

    应用于原始数组,instanceof 结果为 false,但 isArray() 返回 true。

    【讨论】:

      【解决方案3】:

      其实有很多原因。

      • 集合是类型安全的;数组不是。由于数组“假”协方差,ArrayStoreException 可能会在运行时产生

      • 列表或集合的 equals、hashCode 和 toString 方法符合用户的期望;数组上的那些方法做任何事情,但你所期望的 - 一个常见的错误来源。

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

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

      更多详情请阅读:https://stackoverflow.com/a/6105705/1691223

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-25
        • 2017-08-15
        • 2013-10-09
        • 2011-05-18
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 2015-12-13
        相关资源
        最近更新 更多