JavaRush /Blog Java /Random-ES /Pausa para el café #176. Similitudes y diferencias entre ...

Pausa para el café #176. Similitudes y diferencias entre Array y ArrayList. Cómo escribir un método igual efectivo()

Publicado en el grupo Random-ES

Similitudes y diferencias entre Array y ArrayList

Fuente: Medio Este artículo se centra en comprender los conceptos de Array y ArrayList y las diferencias entre ellos. Pausa para el café #176.  Similitudes y diferencias entre Array y ArrayList.  Cómo escribir un método eficiente igual a() - 1

Matriz Java

Un Array es una estructura de datos que permite almacenar una secuencia ordenada de valores del mismo tipo. Por ejemplo, puede crear una serie de caracteres, números, etc. Esto se aplica a todos los tipos primitivos e incluso a objetos como String . Una vez creada la matriz, no podemos cambiar su tamaño. A continuación se muestra un ejemplo general de cómo declarar una variable de referencia de matriz y asignar la matriz:
dataType[] arrayName = new dataType[numElements];
Si intentamos agregar más tamaño que el de la matriz, obtenemos una ArrayIndexOutOfBoundsException .

Declaración de matriz

Para declarar una matriz, utilice caracteres [] después del tipo de datos. Indican que la variable es una referencia a una matriz. Una variable de referencia de matriz puede hacer referencia a matrices de varios tamaños. La nueva palabra clave crea espacio en la memoria para almacenar una matriz con una cantidad específica de elementos. Se asigna una variable de referencia de matriz para hacer referencia a esta matriz recién asignada. El siguiente ejemplo declara una variable de referencia de matriz gameScores , asigna una matriz de cuatro números enteros y asigna gameScores para hacer referencia a la matriz asignada.
int[] gameScores = new int[4];
Los elementos de la matriz se inicializan automáticamente a los valores predeterminados cuando usa la nueva palabra clave para inicializar una referencia de matriz. El valor predeterminado para elementos de tipos de datos enteros y de punto flotante es cero y el valor predeterminado para elementos booleanos es falso . También puede declarar una variable de referencia de matriz sin asignar inmediatamente la matriz y luego asignar la variable con la matriz asignada.
int[] gameScores;

gameScores = new int[4];

Inicialización de una matriz con valores no predeterminados

Puede inicializar elementos de la matriz con valores no predeterminados especificando los valores iniciales entre llaves {} separados por comas.
int [] myArray = { 5 , 7 , 11 };
El ejemplo anterior crea una matriz de tres elementos enteros con los valores 5, 7 y 11. Esta inicialización de la matriz no requiere el uso de la nueva palabra clave porque el tamaño de la matriz se establece automáticamente en la cantidad de elementos en el llaves rizadas. Para matrices grandes, la inicialización se puede lograr definiendo primero la matriz y luego usando un bucle para asignar los elementos de la matriz. Se puede acceder a los elementos de la matriz utilizando sus índices de base cero.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

Lista de arreglo

Una ArrayList es una lista ordenada de elementos de un tipo de referencia redimensionable . También es una clase del paquete java.util que pertenece a Java Collection Framework. ArrayList nos proporciona matrices dinámicas y se encarga automáticamente de cambiar su tamaño. A medida que agrega elementos a ArrayList, su tamaño de memoria aumenta automáticamente. Puede utilizar un ArrayList utilizando import java.util.ArrayList; . También podemos crear una instancia de ArrayList usando la siguiente declaración:
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList puede crecer en tamaño para acomodar los elementos que necesita. ArrayList no admite tipos primitivos como int , sino tipos de referencia como Integer . Un error común entre los principiantes es declarar un ArrayList de un tipo primitivo como int , como en ArrayList<int> myVals . Esto da como resultado un error de compilación: "tipo inesperado, encontrado: int, requerido: referencia". Ejemplo: creemos un objeto ArrayList llamado cars , que almacenará las cadenas:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Para agregar elementos a un ArrayList , use el método add() . Para acceder a un elemento de un ArrayList se utiliza el método get() .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
La diferencia entre una matriz incorporada y una ArrayList en Java es que en el primer caso, el tamaño de la matriz no se puede cambiar (si desea agregar o eliminar elementos a/desde la matriz, debe crear uno nuevo). ). Mientras que en un ArrayList , los elementos se pueden agregar y eliminar en cualquier momento.

Similitudes entre Array y ArrayList

  • Array y ArrayList se utilizan para almacenar elementos.
  • Array y ArrayList pueden almacenar valores nulos.
  • Ambos procesos ocurren en tiempo constante.
  • Es posible que tengan valores duplicados.
  • Array y ArrayList no garantizan la presencia de elementos ordenados.

Diferencias clave entre Array y ArrayList

La principal diferencia entre una matriz ( Array ) y una ArrayList es la naturaleza estática de una matriz y la naturaleza dinámica de una ArrayList . Una vez creada, no puede cambiar el tamaño de la matriz, mientras que ArrayList puede cambiar su tamaño según sea necesario. Otra diferencia importante es que una matriz es una funcionalidad básica proporcionada por Java. Por otro lado, ArrayList es parte del marco de colecciones en Java. Podemos acceder a los elementos de una matriz usando un corchete en el que podemos especificar un índice. Si bien existe un conjunto de métodos para acceder a los elementos del ArrayList y cambiarlos. Aunque son diferentes, ambos son comparables en otros aspectos. Ambas estructuras de datos en Java se basan en índices y le permiten almacenar objetos. Además, permiten valores nulos y duplicados. Si conoce de antemano el tamaño de los objetos, es mejor utilizar una matriz. Pero si no está seguro del tamaño, debería utilizar ArrayList en su lugar .

Cómo escribir un método igual efectivo()

Fuente: Medio Esta publicación lo ayudará a comprender mejor el uso del método equals() cuando trabaje con código Java. Si hablamos del método equals() predeterminado y sin ninguna implementación, entonces es en muchos aspectos similar a la operación == . Es decir, este método compara objetos. Por ejemplo, equals() compara dos cadenas y devuelve verdadero si las cadenas son iguales y falso si no lo son. Tenga en cuenta que el operador == no se recomienda para comparar objetos en Java. La razón es que al comparar objetos, == solo devolverá verdadero si las referencias apuntan al mismo objeto. La forma más sencilla de evitar problemas es no anular el método igual , en cuyo caso cada instancia de la clase es igual sólo a sí misma. Solo necesita anular iguales cuando la clase tiene un concepto de igualdad lógica que es diferente de la simple identidad del objeto y la superclase aún no ha anulado la igualdad. Por lo tanto, cuando se utiliza el método equals() , es necesario averiguar si las referencias a objetos son lógicamente equivalentes y si se refieren al mismo objeto.

Propiedades del método igual

Cada método igual implementa una relación de equivalencia . Tiene las siguientes propiedades:
  • Reflexivo : para cualquier valor de referencia no nulo x, x.equals (x) debe devolver verdadero .

  • Simétrico : para cualquier valor de referencia no nulox e y , x.equals(y) debe devolver verdadero solo si y.equals(x) devuelve verdadero .

  • Transitivo : para cualquier valor de referencia no nulo x , y , z , si x.equals(y) devuelve verdadero y y.equals(z) devuelve verdadero , entonces x.equals(z) también debe devolver verdadero .

  • Consistente : para cualquier valor de referencia no nulo x e y, varias llamadas a x.equals(y) deben devolver verdadero o falso de manera consistente .

  • No nulidad : para cualquier valor de referencia x no nulox.equals (nulo) debe devolver falso .

Echemos un vistazo más de cerca a cada propiedad:

Reflexividad:

Un objeto debe ser igual a sí mismo. Para verificar esto, agregue una instancia de su clase a la colección. El método contiene bien puede indicar que la colección no contiene la instancia que acaba de agregar.

Simetría:

Dos objetos (pueden ser de diferentes clases) deben ser iguales entre sí.

Subsecuencia:

No escriba un método igual que dependa de recursos volátiles o poco confiables.

distinto de cero:

Siempre devuelve verdadero si el objeto pasado a igual es nulo .

Resumamos:

Aquí hay una receta para un método de calidad igual :
  1. Utilice el operador == para comprobar si un argumento es una referencia a este objeto.

  2. Utilice el operador instancia de para comprobar si un argumento es del tipo correcto.

  3. Transfiera el argumento al tipo correcto.

  4. Para cada campo "significativo" en una clase, verifique si ese campo de argumento coincide con el campo correspondiente de ese objeto:

    • Para campos primitivos: cuyo tipo no es flotante o doble , utilice el operador == para realizar comparaciones.
    • Para campos de referencia de objetos: llame al método igual de forma recursiva; para campos de coma flotante utilice el método estático Float.compare(float, float); y para campos dobles utilice Double.compare(double, double) .
    • Para campos de matriz: aplique estas pautas a cada elemento. Si cada elemento en un campo de matriz es significativo, use uno de los métodos Arrays.equals() .
    • Algunos campos de referencia de objetos pueden contener valores nulos . Para evitar generar una NullPointerException , verifique la igualdad de dichos campos usando el método estático Objects.equals(Object, Object) .
  5. Cuando termines de escribir tu método de iguales , hazte tres preguntas: ¿Es simétrico? ¿Es transitivo? ¿Es consistente?

Y recuerde, siempre anule hashCode cuando anule iguales .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION