【问题标题】:int[] and Integer[] arrays - What is the difference?int[] 和 Integer[] 数组 - 有什么区别?
【发布时间】:2013-09-21 14:56:22
【问题描述】:

考虑以下基础:

  1. 任何Object 都只存在于堆中,
  2. 阵列 IS-A Object
  3. Integer IS-A Object

我发现自己很难回答这么简单的问题:int[]Integer[] JVM 内部 之间有什么区别吗?还是仅在“编译时”才有意义?

【问题讨论】:

    标签: java arrays integer int


    【解决方案1】:

    在运行时存在差异。

    int[] 是一个原始 int 值数组。 Integer[] 是一个“对象”数组,包含对 Integer 对象的引用。

    最重要的实际区别:int[] 不能保存 null 值。

    但我仍然感到困惑:int[] 是否只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?

    int[] 确实存储原始类型。并且数组本身存在于堆上。但是,这些原语被分配为数组的一部分。它们不会单独存储在堆的其他地方。这与原始字段如何成为对象实例的一部分非常相似:对象位于堆上,并且其字段是该对象的组成部分(而对于非原始字段,只有引用存储在对象内部并且引用指向的目标实例单独存储在堆上)。

    您可以说int 被“包裹”在数组中。

    【讨论】:

    • 您也可以将 null 分配给数组,而不管它存储的类型如何
    • 是的,数组本身可以为空。但不是原始类型数组中的元素。
    • @Thilo,非常感谢您的回答。但我仍然感到困惑:int[] 是否只存储原始值?如果是这样 - 这是否意味着原始类型可以存在于堆上而不被包装?
    【解决方案2】:

    这张图片应该可以帮助您理解其中的区别:

    int 是一个数字,它是一个原始类型
    Integer 是一个对象

    当你有一个Integers 数组时,你实际上有一个对象 数组。 ints 的数组是原始类型的数组。

    由于数组是对象,它们被分配在堆上。如果是ints 的数组,这些ints 也将分配在堆上,在数组内。

    您可能会发现this link 很有帮助。

    【讨论】:

      【解决方案3】:

      首先,Integer 是一个类/对象,而int 是一个原始类型。整数是一个 wrapper 用于 int。如果您需要存储一个 null 值,或者需要使用 collection,请使用 Integer。你可以做-

      List<Integer> integerList = new ArrayList<Integer>();
      

      因此,原始类型数组不同于整数对象数组。

      【讨论】:

        【解决方案4】:
        • Integer[] 是对象的数组(对象)
        • int[] 是一个数组(对象) 基元数

        Integer 和 int summarized here 是有区别的。

        【讨论】:

          猜你喜欢
          • 2011-03-26
          • 2015-01-29
          • 2010-11-19
          • 2010-10-15
          • 2010-09-05
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多