Vergleiche neue Integer-Objekte in der ArrayList-Frage

7

Ich speichere Integer-Objekte, die einen Index von Objekten darstellen, die ich verfolgen möchte. Später in meinem Code möchte ich überprüfen, ob der Index eines bestimmten Objekts einer dieser Ganzzahlen entspricht, die ich zuvor gespeichert habe. Ich mache das, indem ich eine ArrayList erstelle und aus dem Index einer for-Schleife eine neue Ganzzahl erstelle:

%Vor%

Ich möchte später überprüfen, ob die ArrayList einen bestimmten Index enthält:

%Vor%

Meine Frage ist, wenn ich eine neue Ganzzahl mit new Integer(i) erstellen kann, kann ich Ganzzahlen mit ArrayList.contains() vergleichen? Das heißt, wenn ich ein neues Objekt mit new Integer(i) erstelle, ist das das gleiche wie das zuvor erstellte Integer-Objekt, wenn der int-Wert, der für ihre Erstellung verwendet wurde, gleich ist?

Ich hoffe, ich habe das nicht zu unklar gemacht. Danke für die Hilfe!

    
ericso 13.04.2010, 23:24
quelle

7 Antworten

18

Ja, Sie können List.contains() verwenden, da equals() verwendet wird, und Integer unterstützt das beim Vergleich mit anderen Integer s.

Auch wegen des automatischen Verpackens können Sie einfach schreiben:

%Vor%

Es ist erwähnenswert, dass:

%Vor%

wird immer false zurückgeben, weil ein Integer kein Long ist. Das stolpert die meisten Leute irgendwann.

Versuchen Sie abschließend, Ihre Variablen, die Java-Collections des Interface-Typs sind, nicht den konkreten Typ zu nennen:

%Vor%

nicht

%Vor%     
cletus 13.04.2010, 23:27
quelle
4
  

Meine Frage ist, wenn ich eine neue Ganzzahl mit new Integer (i) erstellen kann, kann ich ganze Zahlen mit ArrayList.contains () vergleichen? Das heißt, wenn ich ein neues Objekt mit new Integer (i) erzeuge, ist das das gleiche wie das zuvor erstellte Integer-Objekt, wenn der int-Wert, mit dem sie erstellt wurden, gleich ist?

Die kurze Antwort ist ja.

Die lange Antwort ist ...

  

Das heißt, wenn ich ein neues Objekt mit new Integer (i) erzeuge, ist das gleiche wie das zuvor erstellte Integer-Objekt, wenn der int-Wert, der verwendet wird, derselbe ist ?

Ich nehme an, du meinst "... wird das die gleiche instance wie ..." ? Die Antwort darauf ist no - das Aufrufen von new erstellt immer eine separate Instanz unabhängig von der vorherigen Instanz, selbst wenn die Konstruktorparameter identisch sind.

Trotz der separaten Identität haben diese beiden Objekte jedoch einen äquivalenten Wert , d. h. der Aufruf von .equals () zwischen ihnen ergibt "true".

Collection.contains ()

Es stellt sich heraus, dass das Vorhandensein separater Instanzen mit äquivalenten Werten ( .equals () wahr zurückgibt) in Ordnung ist. Die Methode .contains() befindet sich in der Schnittstelle Collection . Die Javadoc-Beschreibung für .contains() sagt:

Ссылка

  

Boolescher Wert enthält (Objekt o)

     
    

Gibt true zurück, wenn diese Sammlung vorhanden ist     enthält das angegebene Element. Mehr     formal, gibt wahr genau dann zurück, wenn     Diese Sammlung enthält mindestens eine     Element e so, dass (o == null? e == null     : o.quals (e)) .

  

So wird es tun, was Sie wollen.

Datenstruktur

Sie sollten auch überlegen, ob Sie die richtige Datenstruktur haben.

Betrifft die Liste ausschließlich die Eindämmung? Ist die Reihenfolge wichtig? Interessieren Sie sich für Duplikate? Da es sich bei einer Liste um eine Reihenfolge handelt, kann die Verwendung einer Liste bedeuten, dass der Code für die Reihenfolge wichtig ist. Oder Sie müssen Duplikate in der Datenstruktur pflegen.

Wenn jedoch die Reihenfolge nicht wichtig ist, wenn Sie keine Duplikate haben wollen oder haben werden, und wenn Sie wirklich nur diese Datenstruktur verwenden, um zu testen, ob sie einen bestimmten Wert enthält, dann Sie Vielleicht möchten Sie überlegen, ob Sie stattdessen Set verwenden sollten.

    
Bert F 14.04.2010 01:15
quelle
1

Kurze Antwort ist ja, Sie sollten ArrayList.contains(new Integer(14)) zum Beispiel tun können, um zu sehen, ob 14 in der Liste ist. Der Grund dafür ist, dass Integer die equals -Methode überschreibt, um sich selbst mit anderen Instanzen mit demselben Wert zu vergleichen.

    
Sean 13.04.2010 23:27
quelle
1

Ja, weil List.contains() die Methode equals() des zu vergleichenden Objekts verwendet. Und Integer.equals() vergleicht den Ganzzahlwert.

    
DJ. 13.04.2010 23:28
quelle
1

Wie von Cletus und DJ erwähnt, wird Ihr Ansatz funktionieren.

Ich kenne den Kontext Ihres Codes nicht, aber wenn Sie sich nicht für die einzelnen Indizes interessieren, sollten Sie auch den folgenden Stil berücksichtigen:

%Vor%     
Binil Thomas 13.04.2010 23:46
quelle
1

Ich gebe meine Antwort in Form eines (bestandenen) Tests, als ein Beispiel dafür, wie Sie das selbst erforschen können. Nicht, um Sie davon abzuhalten, SO zu benutzen - es ist großartig - nur um Charakterisierungstests zu bewerben.

%Vor%     
Carl Manaster 13.04.2010 23:59
quelle
0

Ja, automatisches Boxen tritt auf, aber dies führt zu einer Leistungseinbuße. Aus Ihrem Beispiel ist nicht klar, warum Sie das Problem auf diese Weise lösen möchten.

Außerdem ist das Erstellen der Integer-Klasse per Hand überflüssig.

    
nick 13.04.2010 23:34
quelle

Tags und Links