TreeMap. Null в качестве ключа

TreeMap. Null в качестве ключа

Если TreeMap использует естественный порядок сортировки, то при добавлении нового элемента выполняется проверка ключа на null. Если key == null, он выбрасывает NullPointerException.

Если в TreeMap передан компаратор, который не допускает работу с null, то попытка передать null в качестве ключа также приведет к выбросу NullPointerException.


class MyComparator implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        return o1.toString().compareTo(o2.toString());
    }
}


Map<String, Integer> map = new TreeMap<>(new MyComparator());
map.put("aaa", 111);
map.put("hhh", 222);
map.put(null, 555); // java.lang.NullPointerException
В этом примере когда TreeMap вызовет метод compare(), из объекта o1 будет вызван метод toString(), который, в свою очередь, приведёт к выбросу NullPointerException, т.к. o1 является null.

Если переписать компаратор как в примере ниже, то в качестве ключа можно свободно передавать null, поскольку ему абсолютно не важно какой объект передан для сравнения.


class MyComparator implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        return -1;
    }
}


System.out.println(map); // {null=555, hhh=222, aaa=111}
Коллекции