2013-06-03 10 views
13

Dieser einfache Java-Code fügt 2 auf einen Satz von long und anschließend druckt, ob 2 ein Mitglied des Satzes ist:Java-Code mit HashSet von Longs funktioniert nicht?

import java.util.*; 

class A { 
    public static void main(String[] args) { 
     HashSet<Long> s = new HashSet<Long>(); 
     long x = 2; 
     s.add(x); 
     System.out.println(s.contains(2)); 
    } 
} 

Es sollte true drucken, da 2 in dem Satz ist, sondern druckt es false. Warum?

$ javac A.java && java A 
false 
+0

Verwenden Sie ein 'Long'-Objekt anstelle eines' Long'-Primitivs. –

+0

@LuiggiMendoza - Ein "langes" Primitiv hätte wegen Autoboxing gut funktioniert. Das Problem ist, dass es ein "int" Primitiv war. –

+0

Entschuldigung, du hast Recht. Das Literal 2 wurde als "int" behandelt und somit zu "Integer" autoboxiert. –

Antwort

21

Ihr Set enthält Instanzen von Long und Sie waren auf der Suche nach einer Integer (Art, in denen ein int eingerahmt wird, wenn ein Object erforderlich).

-Test

System.out.println(s.contains(Long.valueOf(2))); 

oder

System.out.println(s.contains(2L)); 
+11

Ich würde lieber "2L" ("L" Großbuchstaben) anstelle von "2l" eingeben, da 2l wie einundzwanzig aussieht. –

+0

@MarlonBernardes Bearbeitet: '2l' geändert zu' 2L'. –

1

Ihre Hashset speichert das Objekt von Long und int/Integer nicht .. Sie versuchen, ein Integer zu bekommen, wo int eingerahmt wird, während ein Objekt erforderlich ist.

+0

Deutlich verbessert. Mein Downvote ist jetzt entfernt. –

6

Wenn Sie s.contains(2) sagen, sucht es nach 2 die standardmäßig ein int, die Integer eingerahmt wird. Aber das Objekt, das Sie gespeichert haben, war 10. So gibt es false

Versuchen Sie stattdessen s.contains(Long.valueOf(2)) verwenden.

+0

Eigentlich war das gespeicherte Objekt ein 'Long', kein' Long'. Aber +1, um die Essenz des Problems zu korrigieren. –

+0

Hoppla. Nur ein Tippfehler. Danke für die Benachrichtigung. :) –