【问题标题】:What is the default initialization of an array in Java?Java中数组的默认初始化是什么?
【发布时间】:2011-03-26 12:08:27
【问题描述】:

所以我声明并初始化了一个 int 数组:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

假设我这样做......

int[] arr = new int[5];
System.out.println(arr[0]);

...0 将打印到标准输出。另外,如果我这样做:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

...true 将打印到标准输出。那么默认情况下Java是如何初始化我的数组的呢?假设默认初始化将数组索引设置为0 是否安全,这意味着我不必遍历数组并对其进行初始化?

谢谢。

【问题讨论】:

标签: java arrays initialization


【解决方案1】:

来自Java Language Specification

  • 每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化(第 15.9 节、第 15.10 节):
 - For type byte, the default value is zero, that is, the value of `(byte)0`.
 - For type short, the default value is zero, that is, the value of `(short)0`.
 - For type int, the default value is zero, that is, `0`.
 - For type long, the default value is zero, that is, `0L`.
 - For type float, the default value is positive zero, that is, `0.0f`.
 - For type double, the default value is positive zero, that is, `0.0d`.
 - For type char, the default value is the null character, that is, `'\u0000'`.
 - For type boolean, the default value is `false`.
 - For all reference types (§4.3), the default value is `null`.

【讨论】:

  • 那么 Array of Long s 和 Integer s 呢?
  • @GeorgyDobrev。这些是引用类型。根据上述规范,它们将为空。
  • 字符串数组呢?
  • @Zac 同上,String 是一个对象,所以数组中的默认值为null
【解决方案2】:

如果您想将数组初始化为不同的值,您可以使用Arrays.fill() 方法。此方法将帮助您为数组的每个元素设置值。

import java.util.Arrays;

public class ArraysFillExample {
    public static void main(String[] args) {
        // Assign -1 to each elements of numbers array
        int[] numbers = new int[5];
        Arrays.fill(numbers, -1);
        System.out.println("Numbers: " + Arrays.toString(numbers));

        // Assign 1.0f to each elements of prices array
        float[] prices = new float[5];
        Arrays.fill(prices, 1.0f);
        System.out.println("Prices : " + Arrays.toString(prices));

        // Assign empty string to each elements of words array
        String[] words = new String[5];
        Arrays.fill(words, "");
        System.out.println("Words  : " + Arrays.toString(words));

        // Assign 9 to each elements of the multi array
        int[][] multi = new int[3][3];
        for (int[] array : multi) {
            Arrays.fill(array, 9);
        }
        System.out.println("Multi  : " + Arrays.deepToString(multi));
    }
}

上面代码sn-p的输出是:

Numbers: [-1, -1, -1, -1, -1]
Prices : [1.0, 1.0, 1.0, 1.0, 1.0]
Words  : [, , , , ]
Multi  : [[9, 9, 9], [9, 9, 9], [9, 9, 9]]

参考:https://kodejava.org/how-do-i-fill-array-with-non-default-value/

【讨论】:

    【解决方案3】:

    Java 中的每个类都有一个构造函数(构造函数是一个在创建新对象时调用的方法,它初始化类变量的字段)。因此,当您创建类的实例时,会在创建对象时调用构造方法,并在此时初始化所有数据值。

    对于整数数组类型的对象,数组中的所有值都在构造方法中初始化为 0(零)。 类似地,对于布尔数组的对象,所有值都初始化为 false。

    所以 Java 在创建对象时通过运行其构造方法来初始化数组

    【讨论】:

      【解决方案4】:

      Java 程序中没有被程序员明确设置的所有内容都被初始化为零值。

      • 对于 null 的引用(任何包含对象的东西)。
      • 对于 int/short/byte/long 是 0
      • 对于浮点数/双精度数是 0.0
      • 对于 false 的布尔值。
      • 对于 char 是空字符 '\u0000'(其十进制等效值为 0)。

      当您创建一个数组时,所有条目也都归零。所以你的数组在new创建后立即包含五个零

      注意(基于 cmets):Java 虚拟机在分配局部变量时不需要将底层内存清零(这允许在需要时进行有效的堆栈操作),因此为了避免随机值,Java 语言规范要求局部变量是初始化。

      【讨论】:

        【解决方案5】:

        Thorbjørn Ravn Andersen 回答了大多数数据类型。由于关于数组的讨论很激烈,

        引用 jls 规范 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "数组组件在创建时使用默认值初始化"

        我认为无论数组是本地变量还是实例变量或类变量,它都会使用默认值

        【讨论】:

          【解决方案6】:

          Java 表示初始化时 JAVA 数组的默认长度为 10。

          private static final int DEFAULT_CAPACITY = 10;
          

          但是size()方法返回的是数组中插入元素的个数,而且由于在初始化的时候,如果没有在数组中插入任何元素,就会返回零。

          private int size;
          
          public boolean add(E e) {
              ensureCapacityInternal(size + 1);  // Increments modCount!!
              elementData[size++] = e;
              return true;
          }
          
          public void add(int index, E element) {
              rangeCheckForAdd(index);
              ensureCapacityInternal(size + 1);  // Increments modCount!!
              System.arraycopy(elementData, index, elementData, index + 1,size - index);
              elementData[index] = element;
              size++;
          }
          

          【讨论】:

          • 这看起来像 ArrayList,而不是数组。
          【解决方案7】:

          根据java,

          数据类型 - 默认值

          字节 - 0

          短 - 0

          int - 0

          长 - 0L

          浮动 - 0.0f

          双倍 - 0.0d

          char - '\u0000'

          字符串(或任何对象) - null

          布尔值 - 假

          【讨论】:

          • 他问的不是字段,而是数组组件。
          • @EJP 你能详细说明数组组件的含义吗????通常数组有一些数据类型(相同类型),如上初始化,你能告诉我,组件的意思吗???
          • @AbhishekSingh 根据Chapter 10. Arrays组件元素的另一个名称:[...]These variables are called the components of the array.[...]
          【解决方案8】:

          JLS明确表示

          数组初始化器创建一个数组并为其所有组件提供初始值。

          这与数组是实例变量还是局部变量或类变量无关。

          原始类型的默认值:docs

          对于对象,默认值为null

          【讨论】:

          • 不回答问题。他在询问默认初始化。
          猜你喜欢
          • 2022-11-17
          • 1970-01-01
          • 2014-02-22
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 2016-09-17
          • 2014-11-30
          相关资源
          最近更新 更多