2013-08-25 6 views
6

Привет всем. Я делаю словарь App, в котором мне нужно создать List<String> (или ArrayList). Для этого я создал следующий фрагмент кода (просто пример):ArrayList автоматически добавляет нулевые объекты

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

Я также попытался следующие:

tempSOLUTION.add(new String(temp)); 

Оба из них добавить элемент в список , но в то время отладки, я считаю, что это массив 12 объектов, которые являются следующие:

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

Моя проблема заключается в том, что я не могу иметь эти нулевые элементы, так как этот новый список является ключевым на HashableMap<String>, так что любой изменение будет вызывают исключение, поскольку ключ НЕ будет существовать.

Скриншот списка (tempSOLUTION) детали с помощью отладчика: http://www.pabloarteaga.es/stackoverflow.jpg

Как я могу добавить элемент в список, не создавая все эти нулевые элементы?

После поисков, я нашел ответ о том, как удалить эти нулевые элементы, а именно:

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

Но это не работает для моих целей.

Заранее спасибо.

ответ

15

Возможно, вы просматриваете свой внутренний массив с помощью отладчика. Это не имеет значения; это просто деталь реализации.

Важно то, что видно через его публичный API. Другими словами, то, что звонит size() (и т. Д.), Говорит вам. (И если это не возвращает 1 в вашем примере кода, то что-то странное происходит!)

+0

Большое спасибо, решил мой вопрос :) Примите это как ответ, как только система позволит мне. – vagaerg

6

Из скриншота видно, что то, что именно

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

не сам, но ArrayList его переменная-член objectData, которая является внутренним буфером ArrayList (где он фактически хранит элементы, которые вы добавляете к нему).

Этот буфер имеет больший размер, чем фактический размер ArrayList, поскольку в противном случае всякий раз, когда вы добавляете новый элемент, весь objectData должен быть перераспределен как больший массив, и все элементы скопированы, но это, безусловно, дорого.

Следуйте совету Оли, просто игнорируйте детали реализации и доверяйте только интерфейсу.

+0

Хорошо, спасибо. Не знал, что это так. Итак, если мой массив был больше 12 элементов, этот буфер был бы еще больше? Извините, что не голосовали, но мне не хватает репутации. – vagaerg

Смежные вопросы