【问题标题】:int array initializationint 数组初始化
【发布时间】:2012-11-10 19:01:28
【问题描述】:

我在这里有一个与 Java 相关的简单问题。 假设您有一个 int 数组作为实例变量:

int[] in = new int[5];

所以,现在默认情况下它包含 5 个零。 但是,如果您有与局部变量相同的数组怎么办。它是否被初始化为零?那不是家庭作业,我正在学习 Java 语言。 最好的问候

【问题讨论】:

  • 但是我想要一些讨论让我了解底层逻辑,而不只是记住答案。
  • @uml 为了更好地理解,请参阅 rohit jains 回答 :)

标签: java arrays initialization int default-value


【解决方案1】:

在实例变量或局部变量中声明的数组是否会被初始化为默认值并不重要。

每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化。

根据JLS

An array initializer creates an array and provides initial values for all its components.

【讨论】:

    【解决方案2】:

    首先要理解的是,局部变量存储在堆栈中,它们没有用它们的默认值显式初始化。而 实例变量 存储在 Heap 中,并且默认情况下使用它们的 默认值 进行初始化。

    此外,对象也会在上创建,无论实例引用变量是持有其引用还是局部引用变量。


    现在,当您将这样的数组引用声明为局部变量并使用数组对其进行初始化时,会发生什么:-

    int[] in = new int[5];
    

    数组引用(in)存储在堆栈中,并且为能够在上保存5个整数元素的数组分配了内存(请记住,对象是在堆上创建的)。然后,在 Heap 上分配 5 个连续的内存位置(size = 5),用于存储 integer 值。并且数组对象上的每个 index 都按顺序保存了对这些内存位置的 reference。然后数组引用指向该数组。因此,由于在堆上分配了 5 个整数值的内存,因此将它们初始化为默认值。

    而且,当你声明你的数组引用时,不要用任何数组对象初始化它:-

    int[] in;
    

    数组引用是在 Stack 上创建的(因为它是一个局部变量),但默认情况下它不会初始化为数组,也不会初始化为 null,与实例变量。


    所以,这就是使用第一种数组声明和初始化方式时的分配方式:-

    "Your array reference"
         "on stack"    
    
           |    |          "Array object on Heap"
           +----+                  
           | in |---------->  ([0, 0, 0, 0, 0])
           +----+
           "Stack"                  "Heap"
    

    【讨论】:

    • 简而言之,如果你这样做,int[] in = new int[5],数组将被初始化为默认值。
    • 并且数组对象上的每个索引都按顺序保存对这些内存位置的引用。 并非如此。索引只是数组起点的偏移量。
    【解决方案3】:

    对于原始类型数组,它被初始化为其默认值。 在documentation 它说:

    创建一个指定长度的一维数组,并且 数组的每个组件都被初始化为其默认值

    对于整数类型默认值为0。

    【讨论】:

      【解决方案4】:

      是的,当您初始化一个数组时,内容将被设置为该类型的默认值,int 为 0,引用类型为 null

      如果您初始化一个数组并检查其内容,您可以自己看到:

      ...
      final int[] in = new int[5];
      
      for (int i = 0; i < in.length; i++) {
          System.out.println(in[i]);
      }
      ...
      

      这将打印:

      0
      0
      0
      0
      0
      

      【讨论】:

        【解决方案5】:

        如果你这样做是一样的:

        int[] in = new int[5] 作为实例变量或局部变量。数组对象in 在这两种情况下都将包含零。

        不同之处在于您是否会执行以下操作:

        1. 实例变量:int[] in; (它使用 null 进行初始化),并且in 对象将存在于堆空间中。

        2. 局部变量:int[] in; (它必须由用户初始化)将存在于 stack

        【讨论】:

          【解决方案6】:

          是的

          public void method() {
              int[] in = new int[5];
              System.out.pritnln(in[0]); //output in 0
          }
          

          在这种情况下,您的数组是一个局部变量,您只需初始化您的数组。一旦你初始化了你的数组,你的数组元素**会得到它们的**默认值

          【讨论】:

          • 为什么它包含零?局部变量需要显式初始化。
          • 在这种情况下,你的数组是局部变量,而不是它的元素,你初始化了你的数组,所以数组中的元素得到了它们的默认值:)
          【解决方案7】:

          当您将数组实例化为局部变量时,该数组不包含 5 个零。

          【讨论】:

          • 那么,它包含什么?垃圾?
          猜你喜欢
          • 1970-01-01
          • 2021-01-31
          • 2017-08-01
          • 1970-01-01
          • 2012-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多