JavaRush /Blogue Java /Random-PT /Pausa para café #176. Semelhanças e diferenças entre Arra...

Pausa para café #176. Semelhanças e diferenças entre Array e ArrayList. Como escrever um método equals() eficaz

Publicado no grupo Random-PT

Semelhanças e diferenças entre Array e ArrayList

Fonte: Medium Este artigo se concentra na compreensão dos conceitos de Array e ArrayList e as diferenças entre eles. Pausa para café #176.  Semelhanças e diferenças entre Array e ArrayList.  Como escrever um método equals() eficiente - 1

Matriz Java

Um Array é uma estrutura de dados que permite armazenar uma sequência ordenada de valores do mesmo tipo. Por exemplo, você pode criar uma matriz de caracteres, números e assim por diante. Isso se aplica a todos os tipos primitivos e até mesmo a objetos como String . Depois que o array for criado, não podemos alterar seu tamanho. Aqui está um exemplo geral de declaração de uma variável de referência de array e alocação do array:

dataType[] arrayName = new dataType[numElements];
Se tentarmos adicionar mais do que o tamanho do array, obteremos um ArrayIndexOutOfBoundsException .

Declaração de matriz

Para declarar um array, use caracteres [ ] após o tipo de dados. Eles indicam que a variável é uma referência a um array. Uma variável de referência de matriz pode referir-se a matrizes de vários tamanhos. A palavra-chave new cria espaço na memória para armazenar um array com um número especificado de elementos. Uma variável de referência de array é atribuída para fazer referência a esse array recém-alocado. O exemplo a seguir declara uma variável de referência de matriz gameScores , aloca uma matriz de quatro números inteiros e atribui gameScores para se referir à matriz alocada.

int[] gameScores = new int[4];
Os elementos do array são inicializados automaticamente com valores padrão quando você usa a palavra-chave new para inicializar uma referência de array. O valor padrão para elementos de tipos de dados inteiros e de ponto flutuante é zero, e o valor padrão para elementos booleanos é false . Você também pode declarar uma variável de referência de matriz sem alocar imediatamente a matriz e, em seguida, atribuir a variável à matriz alocada.

int[] gameScores;

gameScores = new int[4];

Inicializando um array com valores não padrão

Você pode inicializar elementos da matriz com valores não padrão especificando os valores iniciais entre chaves {} separados por vírgulas.

int [] myArray = { 5 , 7 , 11 };
O exemplo acima cria um array de três elementos inteiros com os valores 5, 7 e 11. Esta inicialização do array não requer o uso da palavra-chave new porque o tamanho do array é automaticamente definido para o número de elementos no aparelho encaracolado. Para arrays grandes, a inicialização pode ser realizada primeiro definindo o array e depois usando um loop para atribuir os elementos do array. Os elementos do array podem ser acessados ​​usando seus índices baseados em zero.

Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

ListaArray

Um ArrayList é uma lista ordenada de elementos de um tipo de referência redimensionável . É também uma classe do pacote java.util pertencente ao Java Collection Framework. ArrayList nos fornece arrays dinâmicos e gerencia automaticamente o redimensionamento deles. À medida que você adiciona elementos ao ArrayList, o tamanho da memória aumenta automaticamente. Você pode usar um ArrayList usando import java.util.ArrayList; . Também podemos criar uma instância ArrayList usando a seguinte instrução:

ArrayList<Type> arrayList = new ArrayList<Type>();
O ArrayList pode aumentar de tamanho para acomodar os elementos necessários. ArrayList não suporta tipos primitivos como int , mas sim tipos de referência como Integer . Um erro comum entre iniciantes é declarar um ArrayList de um tipo primitivo como int , como em ArrayList<int> myVals . Isso resulta em um erro de compilação: “tipo inesperado, encontrado: int, obrigatório: referência”. Exemplo: Vamos criar um objeto ArrayList chamado cars , que irá armazenar as strings:

import java.util.ArrayList; 

ArrayList<String> cars = new ArrayList<String>();
Para adicionar elementos a um ArrayList , use o método add() . Para acessar um elemento de um ArrayList , é utilizado o método get() .

cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
A diferença entre um array integrado e um ArrayList em Java é que no primeiro caso, o tamanho do array não pode ser alterado (se você quiser adicionar ou remover elementos do array, você precisa criar um novo ). Já em um ArrayList os elementos podem ser adicionados e removidos a qualquer momento.

Semelhanças entre Array e ArrayList

  • Array e ArrayList são usados ​​para armazenar elementos.
  • Array e ArrayList podem armazenar valores nulos.
  • Ambos os processos ocorrem em tempo constante.
  • Eles podem ter valores duplicados.
  • Array e ArrayList não garantem a presença de elementos ordenados.

Principais diferenças entre Array e ArrayList

A principal diferença entre um array ( Array ) e um ArrayList é a natureza estática de um array e a natureza dinâmica de um ArrayList . Uma vez criado, você não pode alterar o tamanho do array, enquanto um ArrayList pode alterar seu tamanho conforme necessário. Outra diferença importante é que um array é uma funcionalidade básica fornecida por Java. Por outro lado, ArrayList faz parte da estrutura de coleções em Java. Podemos acessar os elementos de um array usando um colchete no qual podemos especificar um índice. Embora exista um conjunto de métodos para acessar os elementos do ArrayList e alterá-los. Embora sejam diferentes, ambos são comparáveis ​​em outros aspectos. Ambas as estruturas de dados em Java são baseadas em índices e permitem armazenar objetos. Além disso, eles permitem valores nulos e duplicados. Se você sabe o tamanho dos objetos com antecedência, é melhor usar um array. Mas se você não tiver certeza sobre o tamanho, você deve usar ArrayList .

Como escrever um método equals() eficaz

Fonte: Médio Este post irá ajudá-lo a entender melhor o uso do método equals() ao trabalhar com código Java. Se falarmos sobre o método equals() padrão e sem qualquer implementação, então ele é em muitos aspectos semelhante à operação == . Ou seja, este método compara objetos. Por exemplo, equals() compara duas strings e retorna verdadeiro se as strings forem iguais e falso se não forem. Observe que o operador == não é recomendado para comparar objetos em Java. A razão é que ao comparar objetos, == só retornará verdadeiro se as referências apontarem para o mesmo objeto. A maneira mais fácil de evitar problemas é não substituir o método equals , caso em que cada instância da classe é igual apenas a si mesma. Você só precisa substituir equals quando a classe tem um conceito de igualdade lógica diferente da identidade simples do objeto e a superclasse ainda não substituiu a igualdade. Assim, ao usar o método equals() , você precisa descobrir se as referências a objetos são logicamente equivalentes e se se referem ao mesmo objeto.

Propriedades do método igual

Cada método equals implementa uma relação de equivalência . Possui as seguintes propriedades:
  • Reflexivo : para qualquer valor de referência não nulo x, x.equals (x) deve retornar true .

  • Simétrico : para quaisquer valores de referência não nulosx e y , x.equals(y) deve retornar true apenas se y.equals(x) retornar true .

  • Transitivo : para quaisquer valores de referência não nulos x , y , z , se x.equals(y) retornar true e y.equals(z) retornar true , então x.equals(z) também deverá retornar true .

  • Consistente : para quaisquer valores de referência não nulos x e y, várias chamadas para x.equals(y) devem retornar consistentemente true ou retornar consistentemente false .

  • Não nulidade : para qualquer valor de referência não nulo x, x.equals (null) deve retornar false .

Vamos dar uma olhada em cada propriedade:

Reflexividade:

Um objeto deve ser igual a si mesmo. Para verificar isso, adicione uma instância da sua classe à coleção. O método contains pode indicar que a coleção não contém a instância que você acabou de adicionar.

Simetria:

Dois objetos (podem ser de classes diferentes) devem ser iguais entre si.

Subsequência:

Não escreva um método equals que dependa de recursos não confiáveis/voláteis.

Diferente de zero:

Sempre retorna verdadeiro se o objeto passado para equals for null .

Vamos resumir:

Aqui está uma receita para um método de qualidade igual :
  1. Use o operador == para testar se um argumento é uma referência a este objeto.

  2. Use o operador instanceof para verificar se um argumento é do tipo correto.

  3. Transforme o argumento no tipo correto.

  4. Para cada campo “significativo” em uma classe, verifique se aquele campo de argumento corresponde ao campo correspondente daquele objeto:

    • Para campos primitivos: cujo tipo não é float ou double , use o operador == para comparações.
    • Para campos de referência de objeto: chame o método equals recursivamente; para campos de ponto flutuante use o método estático Float.compare(float, float); e para campos duplos use Double.compare(double, double) .
    • Para campos de matriz: aplique estas diretrizes a cada elemento. Se cada elemento em um campo de array for significativo, use um dos métodos Arrays.equals() .
    • Alguns campos de referência de objeto podem conter valores nulos . Para evitar lançar um NullPointerException , verifique a igualdade desses campos usando o método estático Objects.equals(Object, Object) .
  5. Quando você terminar de escrever seu método equals , pergunte-se três coisas: É simétrico? É transitivo? Ele é consistente?

E lembre-se, sempre substitua hashCode ao substituir equals .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION