Как нулевой элемент обрабатывается списком и картой в Java - PullRequest
1 голос
/ 21 марта 2012

Что может быть рационально для выхода ниже? нулевые элементы обрабатываются по-разному списком и картой.

List<Object> hoo = new ArrayList<Object>() {
    {
        add(null);
        add(null);
    }
};

Map<Object, Object> bar = new HashMap<Object, Object>() {
    {
        put(null, null);
        put(null, null);
        put(null, null);

    }
};
System.err.println("hoo:" + hoo.size());
System.err.println("bar:" + bar.size());

Выход:

hoo:2
bar:1

Ответы [ 4 ]

9 голосов
/ 21 марта 2012

Конкретно: списки могут иметь дублирующиеся элементы, но карты не могут иметь дублирующиеся ключи, поэтому у нас может быть 2 нуля в списке, но только один нуль на карте.

Ответ на ваш более общий вопрос (логика поведения этих интерфейсов в отношении дубликатов) заключается в том, что не существует какого-либо одного «более» или «менее» логического способа реализации нулевых ограничений в картах.

Конечно, универсального правила не существует: например, - Первоначально, Hashtables Java не допускали нулевые значения.
Но позже HashMap реализовал другое поведение ( допускает нулевые значения ).

Поскольку в реальном мире, безусловно, есть случаи, когда мы можем иметь нулевые значения, но очень мало случаев, когда у нас был бы / должен быть нулевой ключ, вы можете спросить себя, почему у вас есть несколько записей с нулевым ключом и нулевым значением в той же структуре данных - действительно ли эти значения представляют собой что-то значимое?

2 голосов
/ 21 марта 2012

Потому что Map может иметь только уникальный ключ. В данном случае это null

put(null, null);
put(null, null);
put(null, null);

Предыдущие операторы фактически перезаписывают значение после первого вызова. Вот почему размер остается 1

1 голос
/ 21 марта 2012

Java документация состояния:

Если карта ранее содержала сопоставление для ключа, старое значение заменено

bar:1 совершенно правильно.

0 голосов
/ 21 марта 2012

HashMap не позволит вам хранить значения с дубликатами ключей (в этом случае ваше значение будет нулевым). Вот почему во втором случае размер равен "1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...