JavaRush /Java Blog /Random-IT /Pausa caffè #176. Somiglianze e differenze tra Array e Ar...

Pausa caffè #176. Somiglianze e differenze tra Array e ArrayList. Come scrivere un metodo equals() efficace

Pubblicato nel gruppo Random-IT

Somiglianze e differenze tra Array e ArrayList

Fonte: Medium Questo articolo si concentra sulla comprensione dei concetti di Array e ArrayList e sulle differenze tra loro. Pausa caffè #176.  Somiglianze e differenze tra Array e ArrayList.  Come scrivere un metodo efficiente equals() - 1

Matrice Java

Un Array è una struttura dati che permette di memorizzare una sequenza ordinata di valori dello stesso tipo. Ad esempio, puoi creare una matrice di caratteri, numeri e così via. Questo vale per tutti i tipi primitivi e anche per oggetti come String . Una volta creato l'array, non possiamo modificarne le dimensioni. Ecco un esempio generale di dichiarazione di una variabile di riferimento dell'array e di allocazione dell'array:
dataType[] arrayName = new dataType[numElements];
Se proviamo ad aggiungere più della dimensione dell'array, otteniamo un ArrayIndexOutOfBoundsException .

Dichiarazione di matrice

Per dichiarare un array, utilizzare i caratteri [ ] dopo il tipo di dati. Indicano che la variabile è un riferimento a un array. Una variabile di riferimento dell'array può fare riferimento ad array di varie dimensioni. La nuova parola chiave crea spazio in memoria per archiviare un array con un numero specificato di elementi. Viene assegnata una variabile di riferimento dell'array per fare riferimento a questo array appena allocato. L'esempio seguente dichiara una variabile di riferimento dell'array gameScores , alloca un array di quattro numeri interi e assegna gameScores per fare riferimento all'array allocato.
int[] gameScores = new int[4];
Gli elementi dell'array vengono inizializzati automaticamente sui valori predefiniti quando si utilizza la parola chiave new per inizializzare un riferimento all'array. Il valore predefinito per gli elementi con tipi di dati interi e a virgola mobile è zero e il valore predefinito per gli elementi booleani è false . È inoltre possibile dichiarare una variabile di riferimento dell'array senza allocare immediatamente l'array e quindi assegnare alla variabile l'array allocato.
int[] gameScores;

gameScores = new int[4];

Inizializzazione di un array con valori non predefiniti

È possibile inizializzare gli elementi dell'array con valori non predefiniti specificando i valori iniziali tra parentesi graffe {} separati da virgole.
int [] myArray = { 5 , 7 , 11 };
L'esempio sopra crea un array di tre elementi interi con i valori 5, 7 e 11. Questa inizializzazione dell'array non richiede l'uso della parola chiave new perché la dimensione dell'array viene automaticamente impostata sul numero di elementi nell'array parentesi graffe. Per gli array di grandi dimensioni, l'inizializzazione può essere eseguita definendo prima l'array e quindi utilizzando un ciclo per assegnare gli elementi dell'array. È possibile accedere agli elementi dell'array utilizzando i relativi indici in base zero.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

Lista di array

Un ArrayList è un elenco ordinato di elementi di tipo riferimento ridimensionabile . È anche una classe del pacchetto java.util appartenente al Java Collection Framework. ArrayList ci fornisce array dinamici e ne gestisce automaticamente il ridimensionamento. Man mano che aggiungi elementi all'ArrayList, la dimensione della sua memoria aumenta automaticamente. È possibile utilizzare un ArrayList utilizzando import java.util.ArrayList; . Possiamo anche creare un'istanza ArrayList utilizzando la seguente istruzione:
ArrayList<Type> arrayList = new ArrayList<Type>();
L'ArrayList può aumentare di dimensioni per accogliere gli elementi di cui ha bisogno. ArrayList non supporta tipi primitivi come int , ma piuttosto tipi di riferimento come Integer . Un errore comune tra i principianti è dichiarare un ArrayList di tipo primitivo come int , come in ArrayList<int> myVals . Ciò si traduce in un errore di compilazione: "tipo imprevisto, trovato: int, richiesto: riferimento". Esempio: creiamo un oggetto ArrayList denominato cars , che memorizzerà le stringhe:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Per aggiungere elementi a un ArrayList , utilizzare il metodo add() . Per accedere a un elemento di un ArrayList , viene utilizzato il metodo get() .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
La differenza tra un array integrato e un ArrayList in Java è che nel primo caso la dimensione dell'array non può essere modificata (se vuoi aggiungere o rimuovere elementi all'array, devi crearne uno nuovo ). Mentre in un ArrayList gli elementi possono essere aggiunti e rimossi in qualsiasi momento.

Somiglianze tra Array e ArrayList

  • Array e ArrayList vengono utilizzati per memorizzare gli elementi.
  • Array e ArrayList possono memorizzare valori null.
  • Entrambi i processi avvengono in tempo costante.
  • Potrebbero avere valori duplicati.
  • Array e ArrayList non garantiscono la presenza di elementi ordinati.

Differenze chiave tra Array e ArrayList

La differenza principale tra un array ( Array ) e un ArrayList è la natura statica di un array e la natura dinamica di un ArrayList . Una volta creato, non è possibile modificare la dimensione dell'array, mentre un ArrayList può modificarne le dimensioni secondo necessità. Un'altra differenza importante è che un array è una funzionalità di base fornita da Java. D'altra parte, ArrayList fa parte del framework delle raccolte in Java. Possiamo accedere agli elementi di un array utilizzando una parentesi quadra in cui possiamo specificare un indice. Mentre esiste una serie di metodi per accedere agli elementi di ArrayList e modificarli. Anche se diversi, entrambi sono tuttavia paragonabili sotto altri aspetti. Entrambe queste strutture dati in Java si basano su indici e consentono di archiviare oggetti. Inoltre, consentono valori nulli e duplicati. Se conosci in anticipo la dimensione degli oggetti, è meglio utilizzare un array. Ma se non sei sicuro delle dimensioni, dovresti invece utilizzare ArrayList .

Come scrivere un metodo equals() efficace

Fonte: Medium Questo post ti aiuterà a comprendere meglio l'uso del metodo equals() quando lavori con il codice Java. Se parliamo del metodo equals() predefinito e senza alcuna implementazione, allora è per molti versi simile all'operazione == . Cioè, questo metodo confronta gli oggetti. Ad esempio, equals() confronta due stringhe e restituisce true se le stringhe sono uguali e false in caso contrario. Tieni presente che l' operatore == non è consigliato per confrontare oggetti in Java. Il motivo è che quando si confrontano oggetti, == restituirà vero solo se i riferimenti puntano allo stesso oggetto. Il modo più semplice per evitare problemi è non sovrascrivere il metodo equals , nel qual caso ogni istanza della classe è uguale solo a se stessa. È necessario sovrascrivere equals solo quando la classe ha un concetto di uguaglianza logica diverso dalla semplice identità dell'oggetto e la superclasse non ha ancora sovrascritto l'uguaglianza. Pertanto, quando si utilizza il metodo equals() , è necessario scoprire se i riferimenti agli oggetti sono logicamente equivalenti e se si riferiscono allo stesso oggetto.

Proprietà del metodo uguale

Ciascun metodo equals implementa una relazione di equivalenza . Ha le seguenti proprietà:
  • Riflessivo : per qualsiasi valore di riferimento diverso da null x, x.equals (x) deve restituire true .

  • Simmetrico : per qualsiasi valore di riferimento non nullox e y , x.equals(y) deve restituire vero solo se y.equals(x) restituisce vero .

  • Transitivo : per qualsiasi valore di riferimento non nullo x , y , z , se x.equals(y) restituisce true e y.equals(z) restituisce true , anche x.equals(z) deve restituire true .

  • Coerente : per qualsiasi valore di riferimento non nullo x e y, più chiamate a x.equals(y) devono restituire costantemente true o restituire costantemente false .

  • Non nullità : per qualsiasi valore di riferimento non nullo x, x.equals (null) deve restituire false .

Diamo un'occhiata più da vicino a ciascuna proprietà:

Riflessività:

Un oggetto deve essere uguale a se stesso. Per verificarlo, aggiungi un'istanza della tua classe alla raccolta. Il metodo contiene potrebbe indicare che la raccolta non contiene l'istanza appena aggiunta.

Simmetria:

Due oggetti (possono appartenere a classi diverse) devono essere uguali tra loro.

Sotto sequenza:

Non scrivere un metodo equals che dipenda da risorse inaffidabili/volatili.

Diverso da zero:

Restituisce sempre true se l'oggetto passato a equals è null .

Riassumiamo:

Ecco una ricetta per un metodo di qualità uguale :
  1. Utilizza l' operatore == per verificare se un argomento è un riferimento a questo oggetto.

  2. Utilizzare l' operatore istanzaof per verificare se un argomento è del tipo corretto.

  3. Converti l'argomento nel tipo corretto.

  4. Per ogni campo "significativo" in una classe, controlla se quel campo dell'argomento corrisponde al campo corrispondente di quell'oggetto:

    • Per i campi primitivi: il cui tipo non è float o double , utilizzare l' operatore == per i confronti.
    • Per i campi riferimento oggetto: chiamare ricorsivamente il metodo equals; per i campi in virgola mobile utilizzare il metodo statico Float.compare(float, float); e per i campi doppi utilizzare Double.compare(double, double) .
    • Per i campi dell'array: applica queste linee guida a ciascun elemento. Se ogni elemento in un campo array è significativo, utilizza uno dei metodi Arrays.equals() .
    • Alcuni campi di riferimento all'oggetto possono contenere valori nulli . Per evitare di lanciare una NullPointerException , controlla l'uguaglianza di tali campi utilizzando il metodo statico Objects.equals(Object, Object) .
  5. Quando finisci di scrivere il metodo equals , poniti tre domande: è simmetrico? È transitivo? È coerente?

E ricorda, sovrascrivi sempre hashCode quando esegui l'override di equals .
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION