JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 176. Ähnlichkeiten und Unterschiede zwisc...

Kaffeepause Nr. 176. Ähnlichkeiten und Unterschiede zwischen Array und ArrayList. So schreiben Sie eine effektive equal()-Methode

Veröffentlicht in der Gruppe Random-DE

Ähnlichkeiten und Unterschiede zwischen Array und ArrayList

Quelle: Medium Dieser Artikel konzentriert sich auf das Verständnis der Konzepte von Array und ArrayList und der Unterschiede zwischen ihnen. Kaffeepause Nr. 176.  Ähnlichkeiten und Unterschiede zwischen Array und ArrayList.  So schreiben Sie eine effiziente equal()-Methode - 1

Java-Array

Ein Array ist eine Datenstruktur, die es Ihnen ermöglicht, eine geordnete Folge von Werten desselben Typs zu speichern. Sie können beispielsweise ein Array aus Zeichen, Zahlen usw. erstellen. Dies gilt für alle primitiven Typen und sogar für Objekte wie String . Sobald das Array erstellt ist, können wir seine Größe nicht mehr ändern. Hier ist ein allgemeines Beispiel für die Deklaration einer Array-Referenzvariablen und die Zuweisung des Arrays:
dataType[] arrayName = new dataType[numElements];
Wenn wir versuchen, mehr als die Größe des Arrays hinzuzufügen, erhalten wir eine ArrayIndexOutOfBoundsException .

Array-Deklaration

Um ein Array zu deklarieren, verwenden Sie [ ] -Zeichen nach dem Datentyp. Sie zeigen an, dass die Variable eine Referenz auf ein Array ist. Eine Array-Referenzvariable kann sich auf Arrays unterschiedlicher Größe beziehen. Das Schlüsselwort new schafft Speicherplatz zum Speichern eines Arrays mit einer angegebenen Anzahl von Elementen. Eine Array-Referenzvariable wird zugewiesen, um auf dieses neu zugewiesene Array zu verweisen. Das folgende Beispiel deklariert eine Array-Referenzvariable gameScores , weist ein Array mit vier Ganzzahlen zu und weist gameScores zu, auf das zugewiesene Array zu verweisen.
int[] gameScores = new int[4];
Array-Elemente werden automatisch auf Standardwerte initialisiert, wenn Sie das Schlüsselwort new zum Initialisieren einer Array-Referenz verwenden. Der Standardwert für Elemente von Ganzzahl- und Gleitkomma-Datentypen ist Null und der Standardwert für boolesche Elemente ist false . Sie können auch eine Array-Referenzvariable deklarieren, ohne das Array sofort zuzuweisen, und dann die Variable mit dem zugewiesenen Array zuweisen.
int[] gameScores;

gameScores = new int[4];

Initialisieren eines Arrays mit Nicht-Standardwerten

Sie können Array-Elemente mit nicht standardmäßigen Werten initialisieren, indem Sie die Anfangswerte in geschweiften Klammern {} angeben , die durch Kommas getrennt sind.
int [] myArray = { 5 , 7 , 11 };
Das obige Beispiel erstellt ein Array aus drei ganzzahligen Elementen mit den Werten 5, 7 und 11. Diese Array-Initialisierung erfordert nicht die Verwendung des neuen Schlüsselworts , da die Größe des Arrays automatisch auf die Anzahl der Elemente im festgelegt wird Geschweifte Klammern. Bei großen Arrays kann die Initialisierung erreicht werden, indem zunächst das Array definiert und dann eine Schleife verwendet wird, um die Elemente des Arrays zuzuweisen. Auf Array-Elemente kann über ihre nullbasierten Indizes zugegriffen werden.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

Anordnungsliste

Eine ArrayList ist eine geordnete Liste von Elementen eines skalierbaren Referenztyps . Es handelt sich außerdem um eine Klasse aus dem Paket java.util, das zum Java Collection Framework gehört. ArrayList stellt uns dynamische Arrays zur Verfügung und übernimmt automatisch deren Größenänderung. Wenn Sie Elemente zur ArrayList hinzufügen, erhöht sich die Speichergröße automatisch. Sie können eine ArrayList mit import java.util.ArrayList verwenden . . Wir können eine ArrayList- Instanz auch mit der folgenden Anweisung erstellen:
ArrayList<Type> arrayList = new ArrayList<Type>();
Die ArrayList kann größer werden , um die benötigten Elemente aufzunehmen. ArrayList unterstützt keine primitiven Typen wie int , sondern Referenztypen wie Integer . Ein häufiger Fehler unter Anfängern besteht darin , eine ArrayList eines primitiven Typs wie int zu deklarieren , wie in ArrayList<int> myVals . Dies führt zu einem Kompilierungsfehler: „unerwarteter Typ, gefunden: int, erforderlich: Referenz“. Beispiel: Erstellen wir ein ArrayList- Objekt namens „cars“ , das die Zeichenfolgen speichert:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Um Elemente zu einer ArrayList hinzuzufügen, verwenden Sie die Methode add() . Um auf ein Element einer ArrayList zuzugreifen , wird die Methode get() verwendet .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
Der Unterschied zwischen einem integrierten Array und einer ArrayList in Java besteht darin, dass im ersten Fall die Größe des Arrays nicht geändert werden kann (wenn Sie Elemente zum Array hinzufügen oder daraus entfernen möchten, müssen Sie ein neues erstellen). ). In einer ArrayList hingegen können Elemente jederzeit hinzugefügt und entfernt werden.

Ähnlichkeiten zwischen Array und ArrayList

  • Array und ArrayList werden zum Speichern von Elementen verwendet.
  • Array und ArrayList können Nullwerte speichern.
  • Beide Prozesse laufen in konstanter Zeit ab.
  • Sie können doppelte Werte haben.
  • Array und ArrayList garantieren nicht das Vorhandensein geordneter Elemente.

Hauptunterschiede zwischen Array und ArrayList

Der Hauptunterschied zwischen einem Array ( Array ) und einer ArrayList besteht in der statischen Natur eines Arrays und der dynamischen Natur einer ArrayList . Nach der Erstellung können Sie die Größe des Arrays nicht mehr ändern, während eine ArrayList ihre Größe nach Bedarf ändern kann. Ein weiterer wichtiger Unterschied besteht darin, dass ein Array eine von Java bereitgestellte Grundfunktionalität ist. Andererseits ist ArrayList Teil des Collections-Frameworks in Java. Auf die Elemente eines Arrays können wir über eine eckige Klammer zugreifen, in der wir einen Index angeben können. Zwar gibt es eine Reihe von Methoden, um auf die Elemente der ArrayList zuzugreifen und sie zu ändern. Obwohl sie unterschiedlich sind, sind beide dennoch in anderer Hinsicht vergleichbar. Beide Datenstrukturen in Java basieren auf Indizes und ermöglichen die Speicherung von Objekten. Darüber hinaus erlauben sie Nullwerte und Duplikate. Wenn Sie die Größe der Objekte im Voraus kennen, ist es besser, ein Array zu verwenden. Wenn Sie sich jedoch bezüglich der Größe nicht sicher sind, sollten Sie stattdessen ArrayList verwenden .

So schreiben Sie eine effektive equal()-Methode

Quelle: Medium Dieser Beitrag wird Ihnen helfen, die Verwendung der Methode equal() bei der Arbeit mit Java-Code besser zu verstehen. Wenn wir über die Standardmethode equal() und ohne Implementierung sprechen, dann ähnelt sie in vielerlei Hinsicht der Operation == . Das heißt, diese Methode vergleicht Objekte. Equals() vergleicht beispielsweise zwei Zeichenfolgen und gibt true zurück , wenn die Zeichenfolgen gleich sind, und false, wenn dies nicht der Fall ist. Bitte beachten Sie, dass der ==- Operator für den Vergleich von Objekten in Java nicht empfohlen wird. Der Grund dafür ist, dass == beim Vergleichen von Objekten nur dann true zurückgibt , wenn die Referenzen auf dasselbe Objekt verweisen. Der einfachste Weg, Probleme zu vermeiden, besteht darin, die Methode „equals“ nicht zu überschreiben . In diesem Fall ist jede Instanz der Klasse nur sich selbst gleich. Sie müssen „equals“ nur überschreiben , wenn die Klasse ein Konzept der logischen Gleichheit hat , das sich von der einfachen Identität des Objekts unterscheidet, und die Oberklasse die Gleichheit noch nicht überschrieben hat . Daher müssen Sie bei Verwendung der Methode equal() herausfinden, ob Objektreferenzen logisch äquivalent sind und ob sie sich auf dasselbe Objekt beziehen.

Eigenschaften der equal-Methode

Jede Equals- Methode implementiert eine Äquivalenzbeziehung . Es hat die folgenden Eigenschaften:
  • Reflexiv : Für jeden Referenzwert x ungleich Null muss x.equals (x) true zurückgeben.

  • Symmetrisch : Für alle Nicht-Null-Referenzwertex und ymuss x.equals(y) nur dann true zurückgeben, wenn y.equals ( x) true zurückgibt .

  • Transitiv : Für alle Nicht-Null-Referenzwerte x , y , z muss x.equals(z) auch true zurückgeben, wennx.equals (y) true und y.equals (z) true zurückgibt.

  • Konsistent : Für alle Nicht-Null-Referenzwerte x und y müssenmehrere Aufrufe von x.equals(y) konsistent true oder konsistent false zurückgeben .

  • Nicht-Nullität : Für jeden Referenzwert x ungleich Null muss x.equals (null) false zurückgeben.

Schauen wir uns jede Immobilie genauer an:

Reflexivität:

Ein Objekt muss sich selbst gleich sein. Um dies zu überprüfen, fügen Sie der Sammlung eine Instanz Ihrer Klasse hinzu. Die Methode „contains“ kann durchaus darauf hinweisen, dass die Sammlung die gerade hinzugefügte Instanz nicht enthält.

Symmetrie:

Zwei Objekte (sie können aus unterschiedlichen Klassen stammen) müssen einander gleich sein.

Folge:

Schreiben Sie keine Equals- Methode , die von unzuverlässigen/flüchtigen Ressourcen abhängt.

Nicht Null:

Gibt immer true zurück, wenn das an equal übergebene Objekt null ist .

Fassen wir zusammen:

Hier ist ein Rezept für eine Methode, bei der Qualität gleich ist :
  1. Verwenden Sie den ==- Operator , um zu testen, ob ein Argument eine Referenz auf dieses Objekt ist.

  2. Verwenden Sie den Operator „instanceof“ , um zu überprüfen, ob ein Argument den richtigen Typ hat.

  3. Wandeln Sie das Argument in den richtigen Typ um.

  4. Überprüfen Sie für jedes „signifikante“ Feld in einer Klasse, ob dieses Argumentfeld mit dem entsprechenden Feld dieses Objekts übereinstimmt:

    • Für primitive Felder, deren Typ nicht float oder double ist , verwenden Sie für Vergleiche den Operator == .
    • Für Objektreferenzfelder: Rufen Sie die Methode „equals“ rekursiv auf. Verwenden Sie für Gleitkommafelder die statische Methode Float.compare(float, float); und für doppelte Felder verwenden Sie Double.compare(double, double) .
    • Für Array-Felder: Wenden Sie diese Richtlinien auf jedes Element an. Wenn jedes Element in einem Array-Feld von Bedeutung ist, verwenden Sie eine der Arrays.equals()- Methoden .
    • Einige Objektreferenzfelder können Nullwerte enthalten . Um das Auslösen einer NullPointerException zu vermeiden , überprüfen Sie solche Felder mithilfe der statischen Methode Objects.equals(Object, Object) auf Gleichheit .
  5. Wenn Sie mit dem Schreiben Ihrer Equals- Methode fertig sind , stellen Sie sich drei Fragen: Ist sie symmetrisch? Ist es transitiv? Ist er konsequent?

Und denken Sie daran, hashCode immer zu überschreiben , wenn Sie equal überschreiben .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION