Qual é a boot padrão de um array em Java?

Então estou declarando e inicializando um array int:

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

Digamos que eu faça isso em vez disso …

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

0 será impresso no padrão. Além disso, se eu fizer isso:

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

true será impresso no padrão. Então, como o Java está inicializando meu array por padrão? É seguro assumir que a boot padrão está definindo os índices da matriz como 0 que significaria que eu não tenho que percorrer o array e inicializá-lo?

Obrigado.

Tudo em um programa Java não definido explicitamente para algo pelo programador é inicializado com um valor zero.

  • Para referências (qualquer coisa que contenha um object) que seja null .
  • Para int / short / byte / long que é um 0 .
  • Para float / double que é um 0.0
  • Para booleans isso é false .
  • Para char é o caractere nulo '\u0000' (cujo equivalente decimal é 0).

Quando você cria uma matriz de algo, todas as inputs também são zeradas. Portanto, sua matriz contém cinco zeros logo após ser criada por new .

Nota (com base nos comentários): A Java Virtual Machine não é necessária para zerar a memory subjacente ao alocar variables ​​locais (isso permite operações eficientes de pilha, se necessário), portanto, para evitar valores randoms, a Java Language Specification requer que variables ​​locais sejam inicializadas.

Da especificação da linguagem Java :

  • Cada variável de class, variável de instância ou componente de matriz é inicializada com um valor padrão quando é criada (§15.9, §15.10):

    • Para o tipo byte, o valor padrão é zero, ou seja, o valor de (byte)0 .
    • Para o tipo short, o valor padrão é zero, ou seja, o valor de (short)0 .
    • Para o tipo int, o valor padrão é zero, ou seja, 0 .
    • Para o tipo long, o valor padrão é zero, ou seja, 0L .
    • Para o tipo float, o valor padrão é zero positivo, ou seja, 0.0f .
    • Para o tipo double, o valor padrão é zero positivo, ou seja, 0.0d .
    • Para o tipo char, o valor padrão é o caractere nulo, ou seja, '\u0000' .
    • Para o tipo booleano, o valor padrão é false .
    • Para todos os tipos de referência (§4.3), o valor padrão é null .

JLS diz claramente

Um inicializador de matriz cria uma matriz e fornece valores iniciais para todos os seus componentes.

e isso é independente de a matriz ser uma variável de instância ou uma variável local ou uma variável de class.

Valores padrão para tipos primitivos: docs

Para objects, os valores padrão são null .

Thorbjørn Ravn Andersen respondeu pela maioria dos tipos de dados. Desde que houve uma discussão acalorada sobre array,

Citando o componente da matriz http://socs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 “jls é inicializado com um valor padrão quando é criado”

Eu acho que, independentemente de matriz é local ou instância ou variável de class que vai com valores padrão

De acordo com o java

Tipo de dados – valores padrão

byte – 0

curto – 0

int – 0

longo – 0L

flutuador – 0.0f

duplo – 0.0d

char – ‘\ u0000’

String (ou qualquer object) – null

booleano – falso

Java diz que o tamanho padrão de um array JAVA no momento da boot será 10.

 private static final int DEFAULT_CAPACITY = 10; 

Mas o método size() retorna o número de elementos inseridos na matriz e, como no momento da boot, se você não inseriu nenhum elemento na matriz, ele retornará zero.

 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++; } 

Cada class em Java tem um construtor (um construtor é um método que é chamado quando um novo object é criado, que inicializa os campos das variables ​​de class). Portanto, quando você está criando uma instância da class, o método construtor é chamado durante a criação do object e todos os valores de dados são inicializados nesse momento.

Para o object do tipo array inteiro, todos os valores na matriz são inicializados para 0 (zero) no método construtor. Da mesma forma, para o object do array booleano, todos os valores são inicializados como false.

Então Java está inicializando o array executando seu método construtor enquanto cria o object