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.
null
. 0
. 0.0
false
. '\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