Qual é a inicialização padrão de uma matriz em Java?


144

Então, eu estou declarando e inicializando uma matriz 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 ...

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

... 0será impressa na saída 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);

... trueserá impressa na saída padrão. Então, como o Java está inicializando minha matriz por padrão? É seguro assumir que a inicialização padrão está definindo os índices da matriz, o 0que significaria que eu não tenho que percorrer a matriz e inicializá-la?

Obrigado.


Respostas:


281

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

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

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

Nota (com base nos comentários): A Java Virtual Machine não precisa zerar a memória subjacente ao alocar variáveis ​​locais (isso permite operações eficientes de pilha, se necessário). Para evitar valores aleatórios, a Java Language Specification exige que as variáveis ​​locais sejam inicializadas.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Brad Larson

Tudo, exceto variáveis ​​locais, que não são inicializadas em nada, como o compilador dirá.
Marquês de Lorne

@ user207421 conforme mencionado no final da resposta.
Thorbjørn Ravn Andersen

O que significa que a primeira frase da sua resposta não está correta e deve ser alterada. E a sua pergunta 'como você sabe' no bate-papo não tem sentido. O JLS diz isso, é isso, e o compilador o aplica, o mesmo.
Marquês de Lorne

@ user207421 "não definido explicitamente para algo do programador" (que pode ser exigido pelo compilador).
Thorbjørn Ravn Andersen

60

Na especificação da linguagem Java :

  • Cada variável de classe, variável de instância ou componente de matriz é inicializado com um valor padrão quando é criado (§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 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.

2
E quanto à Matriz de Longos e Inteiros?
Georgy Dobrev

1
@GeorgyDobrev. Esses são os tipos de referência. Eles seriam nulos de acordo com a especificação acima.
Dave Costa

E quanto a uma matriz String?
Zac

1
@ Zac igual ao acima, uma String é um objeto, portanto o valor padrão na matriz seria null.
Dave Costa

18

JLS diz claramente

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

e isso independentemente da matriz ser uma variável de instância ou variável local ou variável de classe.

Valores padrão para tipos primitivos: docs

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


1
Não responde a pergunta. Ele está perguntando sobre a inicialização padrão.
Marquês de Lorne

3

De acordo com java,

Tipo de dados - valores padrão

byte - 0

curto - 0

int - 0

longo - 0L

float - 0.0f

duplo - 0,0d

char - '\ u0000'

String (ou qualquer objeto) - null

booleano - false


2
Ele não está perguntando sobre campos, ele está perguntando sobre componentes da matriz.
Marquês de Lorne

3
@EJP você pode por favor elaborar o que significa o componente array ?? geralmente matriz tem algum tipo de dados (mesmo tipo) que é inicializado como acima, então você pode me dizer, média do componente ??
Abhishek Singh

3

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

Citação do jls spec http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "o componente da matriz é inicializado com um valor padrão quando é criado"

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


2

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

Para o objeto do tipo de matriz inteira, todos os valores na matriz são inicializados em 0 (zero) no método construtor. Da mesma forma, para o objeto da matriz booleana, todos os valores são inicializados como false.

Portanto, Java está inicializando a matriz executando seu método construtor enquanto cria o objeto


1

Java diz que o comprimento padrão de uma matriz JAVA no momento da inicialização será 10.

private static final int DEFAULT_CAPACITY = 10;

Mas o size()método retorna o número de elementos inseridos na matriz e, como no momento da inicialização, se você não inseriu nenhum elemento na matriz, 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++;
}

2
Parece ArrayList, não uma matriz.
Thorbjørn Ravn Andersen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.