2013-06-03 10 views
13

Questo codice Java semplice aggiunge 2 ad un insieme di long, e stampa in seguito se 2 è un membro del set:Il codice Java che utilizza HashSet di long non funziona?

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)); 
    } 
} 

Dovrebbe stampare true dal 2 è nel set, ma invece esso stampa false. Perché?

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

Provare a utilizzare un oggetto 'Long' invece di una primitiva' long'. –

+0

@LuiggiMendoza - Una primitiva 'lunga' avrebbe funzionato bene a causa dell'autoboxing. Il problema è che era un primitivo 'int'. –

+0

Siamo spiacenti, hai ragione. Il letterale 2 è stato trattato come 'int', quindi autoboxed in' Integer'. –

risposta

21

Il set contiene le istanze di Long e si era alla ricerca di un Integer (del tipo in cui un int è inscatolato quando è richiesto un Object).

prova

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

o

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

Preferisco digitare "2L" ('L' maiuscolo) anziché "2l", poiché 2l potrebbe sembrare ventuno. –

+0

@MarlonBernardes Modificato: '2l' cambiato in' 2L'. –

1

I suoi negozi HashSet oggetto di Long e non int/Integer .. Si sta tentando di ottenere un intero dove int è inscatolato, mentre è necessario un oggetto.

+0

Notevolmente migliorato. Il mio downvote è ora rimosso. –

6

Quando si dice s.contains(2), si cerca 2 che per impostazione predefinita è un int, che viene inserito in Integer. Ma l'oggetto che hai memorizzato era Long. Quindi restituisce false

Provare a utilizzare s.contains(Long.valueOf(2)) invece.

+0

In realtà, l'oggetto memorizzato era un 'Long', non un' long'. Ma +1 per correggere l'essenza del problema. –

+0

Oops. Solo un refuso Grazie per la notifica. :) –

Problemi correlati