2013-08-25 1 views
6

Ciao a tutti. Sto creando un'app di vocabolario, nella quale ho bisogno di creare uno List<String> (o ArrayList). Per fare ciò, ho creato il seguente pezzo di codice (solo un esempio):ArrayList che aggiunge automaticamente elementi null

List<String> tempSOLUTION = new ArrayList<String>(); 
String temp = "abc123"; 
tempSOLUTION.add(temp); 

Ho anche provato la seguente:

tempSOLUTION.add(new String(temp)); 

Entrambi aggiungere l'articolo alla lista , ma durante il debug, trovo che si tratta di matrice ha 12 oggetti, che sono le seguenti:

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

il mio problema è che non posso avere tali elementi nulli, in quanto questa nuova lista è la chiave su un HashableMap<String>, in modo che qualsiasi cambiare volontà causare un'eccezione, in quanto la chiave NON esisterebbe.

Schermata della lista (tempSOLUTION) dettagli utilizzando il debugger: http://www.pabloarteaga.es/stackoverflow.jpg

Come posso aggiungere un elemento all'elenco senza creare tutti questi elementi nulli?

Dopo aver cercato, ho trovato una risposta su come rimuovere questi elementi nulli, che è:

tempSOLUTION.removeAll(Collections.singleton(null)); 

Ma non funziona per il mio scopo.

Grazie in anticipo.

risposta

15

Probabilmente stai osservando il suo array interno con il debugger. Non importa; è solo un dettaglio di implementazione.

Ciò che conta è ciò che è visibile tramite la sua API pubblica. In altre parole, ciò che viene chiamato da size() (e così via). (E se questo non restituisce 1 nel tuo esempio di codice, allora qualcosa di strano sta succedendo!)

+0

Grazie mille, ho risolto la mia domanda :) La accetterò come risposta non appena il sistema me lo consentirà. – vagaerg

6

Dal tuo screenshot è chiaro che cosa è esattamente

[abc123, null, null, null, null, null, null, null, null, null, null, null] 

non è la stessa, ma la sua ArrayList variabile membro objectData che risulta essere il buffer interno dello ArrayList (in cui effettivamente vengono memorizzati gli elementi aggiunti).

Questo buffer ha una dimensione maggiore della dimensione effettiva del ArrayList perché altrimenti, ogni volta che si aggiunge un nuovo elemento, l'intero objectData dovrebbe essere ridistribuito come un array più grande e tutti gli elementi copiati, ma questo è sicuramente costoso.

Segui il consiglio di Oli, ignora i dettagli di implementazione e considera solo l'interfaccia.

+0

Ok, grazie mille. Non sapevo che fosse così. Quindi, se il mio array fosse più grande di 12 elementi, quel buffer sarebbe ancora più grande? Ci scusiamo per non aver votato, ma non ho abbastanza rep. – vagaerg