Em C/C++
que eu costumava fazer
int arr[10] = {0};
... para inicializar todos os meus elementos da matriz para 0.
Existe um atalho semelhante em Java?
Eu quero evitar o uso do loop, é possível?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
Respostas:
Um valor padrão de 0 para matrizes de tipos integrais é garantido pela especificação do idioma :
Se você deseja inicializar uma matriz unidimensional com um valor diferente, pode usar java.util.Arrays.fill () (que obviamente usará um loop internamente).
fonte
Arrays.fill
não necessariamente usa um loop.Enquanto as outras respostas estiverem corretas (por padrão, os valores da matriz são inicializados como 0), se você desejar fazê-lo explicitamente (por exemplo, se desejar uma matriz preenchida com o valor 42), poderá usar o método fill () de a classe Arrays :
Ou se você é fã de 1-liners, pode usar a
Collections.nCopies()
rotina:Daria arr o valor:
(embora seja
Integer
, e nãoint
, se você precisar do tipo primitivo, poderá adiar a rotina do Apache CommonsArrayUtils.toPrimitive()
:fonte
List<Integer>
paraInteger[]
aint[]
? Isso é um pouco complicado.Arrays.fill
método está criando um problema e ocorre um erro.Em java todos os elementos (tipos inteiros primitivos
byte
short
,int
,long
) são inicializados como 0 por padrão. Você pode salvar o loop.fonte
Como reduz o desempenho do seu aplicativo ....? Leia a seguir.
Na especificação da linguagem Java, o valor padrão / inicial de qualquer objeto pode ser fornecido como segue.
Para o tipo byte , o valor padrão é zero , ou seja, o valor de (byte) é 0 .
Para o tipo curto , o valor padrão é zero , ou seja, o valor de (curto) é 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 , o valor padrão é nulo .
Considerando tudo isso, você não precisa inicializar com zero valores para os elementos da matriz, porque, por padrão, todos os elementos da matriz são 0 para a matriz int.
Porque Uma matriz é um objeto de contêiner que contém um número fixo de valores de um único tipo. Agora o tipo de matriz para você é int assim que considerar o valor padrão para todos os elementos da matriz será automaticamente 0 Porque é segurando tipo int .
Agora considere a matriz para o tipo String para que todos os elementos da matriz tenham valor padrão seja nulo .
Por que não faz isso ......?
você pode atribuir valor nulo usando loop, conforme sugerido na sua pergunta.
Mas se você fizer isso, haverá uma perda inútil do ciclo da máquina. e se você usar em seu aplicativo onde você tem muitas matrizes e fazer isso para cada matriz, isso afetará o desempenho do aplicativo até um nível considerável.
Quanto mais uso do ciclo da máquina ==> Mais tempo para processar os dados ==> O tempo de saída aumentará significativamente . para que o processamento de dados do seu aplicativo possa ser considerado como um nível baixo (diminua a velocidade para algum nível).
fonte
Você pode salvar o loop, a inicialização já é feita para 0. Mesmo para uma variável local.
Mas, por favor, corrija o local em que você coloca os colchetes, para facilitar a leitura (prática recomendada reconhecida):
fonte
Se você estiver usando Flutuante ou Inteiro, poderá atribuir um valor padrão como este ...
fonte
Você pode criar uma nova matriz vazia com o tamanho da matriz existente e atribuí-las novamente à sua matriz. Isso pode ser mais rápido que o outro. Snipet:
Resultado:
fonte
Sim, os valores int em uma matriz são inicializados em zero. Mas você não tem garantia disso. A documentação da Oracle afirma que essa é uma prática ruim de codificação.
fonte
Os valores int já são zero após a inicialização, como todos mencionaram. Se você tem uma situação em que realmente precisa definir valores de matriz como zero e deseja otimizar isso, use
System.arraycopy
:Isso é usado
memcpy
sob a cobertura na maioria ou em todas as implementações do JRE. Observe que o uso de uma estática como essa é seguro, mesmo com vários threads, pois o pior caso é que vários threads sejam realocadoszeros
simultaneamente, o que não prejudica nada.Você também pode usar
Arrays.fill
como alguns outros mencionaram.Arrays.fill
poderia usarmemcpy
em uma JVM inteligente, mas provavelmente é apenas um loop Java e a verificação de limites que isso implica.Compare suas otimizações, é claro.
fonte
Ainda outra abordagem usando lambda acima do java 8
fonte
No c / cpp, não há atalho, mas para inicializar todas as matrizes com o zero subscrito.
Mas em java existe uma ferramenta mágica chamada Arrays.fill () que preenche todos os valores em uma matriz com o número inteiro de sua escolha.
fonte
A inicialização não é necessária em caso de zero, porque o valor padrão de int em Java é zero. Para valores diferentes de zero
java.util.Arrays
fornece várias opções, a mais simples é o método de preenchimento.Também podemos usar Arrays.setAll () se desejarmos preencher valor com base na condição:
fonte
declare a matriz como variável de instância na classe, ou seja, fora de todo método e a JVM fornecerá 0 como valor padrão. Você não precisa mais se preocupar
fonte
resultado 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10
fonte