ho un po 'di codice che crea un elenco, inizializzato con le dimensioni di una mappa:Una mappa java può restituire una dimensione di -1?
private Set<String> mKeys = new HashSet<String>(64);
....
List<String> keyList = new ArrayList<String>(mKeys.size());
sto vedendo un'eccezione: java.lang.IllegalArgumentException: Capacità illegale: -1
Can una mappa restituire una dimensione di -1? Sto guardando il codice sorgente di HashSet, che è supportato da una HashMap. Il codice sorgente di HashMap mostra gli interni dove elementCount viene sempre decrementato su una chiamata removeEntry(). Inoltre, i metodi per la risposta di HashMap.empty() su elementCount sono == 0, che restituirebbe false se elementCount era -1.
Qualcuno si è imbattuto in questo prima? Posso codificarlo, ma mi sembra un trucco, il che mi fa pensare che sto facendo qualcosa di sbagliato con il codice corrente.
EDIT: stavo cercando di semplificare il problema in origine. Il Set che sto utilizzando è in realtà definito come
private static Set<String> mKeys = Collections.synchronizedSet(new HashSet<String>(64));
MODIFICA: la chiave qui può essere nel set sincronizzato. Dal JavaDoc:
E 'indispensabile che l'utente sincronizzare manualmente sul set restituito quando l'iterazione su di esso:
Set s = Collections.synchronizedSet(new HashSet()); ... synchronized(s) { Iterator i = s.iterator(); // Must be in the synchronized block while (i.hasNext()) foo(i.next()); }
La mancata osservanza di questi consigli può causare un comportamento non deterministico.
Il comportamento non deterministico per me potrebbe includere una dimensione di -1. Devo tornare indietro e assicurarmi di sincronizzare correttamente durante l'iterazione sul set, ma sospetto che questo sia il problema.
A meno che non si sta mettendo qualcosa in 'mKeys' in quel codice omesso, si sta facendo un errore in ogni caso : 'mKeys.size()' restituisce il numero di elementi in 'Set', non il numero di bucket. Non è la "dimensione" della struttura dei dati, ma piuttosto il numero di elementi contenuti. – Borealid
È possibile che si sta corrompendo la mappa accedendo da più thread senza sincronizzazione? – finnw
Il codice è semplificato da quello che sto facendo in realtà, in quanto vi è un po 'di sincronizzazione. Aggiornerò la domanda con informazioni più specifiche Sono quasi sicuro che questo non è un problema con il wrapping su Integer.MAX_VALUE. – mmorrisson