Что быстрее map.containsKey(key) || map.get(key) != null

176
10 августа 2018, 23:10

К примеру мне нужно проверить, существует ли какие-либо данные в map, если существуют, то вернуть иначе загрузить из базы данных.

    Map<String, Data> map = Maps.newHashMap();
    //Вариант 1
    map.containsKey(key) ? map.get(key) : map.put(key, loadFormDatabase(key));
    //Вариант 2
    Data data = map.get(key);
    if (data == null) {
        data = map.put(key, loadFormDatabase(key));
    }
    return data;

Т.е. вопрос в том, что будет быстрей: предварительная проверка на существование ключа в map, прежде чем делать get или же сразу get и проверка на != null

Answer 1

Быстрее, короче и нагляднее будет map.computeIfAbsent(key, SomeClass::loadFromDatabase)

Answer 2

Очевидно, что второе быстрее, поскольку оно содержит на одно действие (вызов containsKey) меньше. С другой стороны, стоит обратить внимание на то, могут ли в словаре находиться значения null. Если да, то второй код будет постоянно лазить за ними в базу, а первый отработает верно.

READ ALSO
Ошибка: illegal start of expression

Ошибка: illegal start of expression

Возникает ошибка при создании: (9:9)illegal start of expression

193
Ошибка в HibernateUtil.java

Ошибка в HibernateUtil.java

Ошибка Exception in thread "JavaFX Application Thread" javalang

245
Java SOAP сгенерировать классы плагином cxf

Java SOAP сгенерировать классы плагином cxf

Хочу сгенерировать джава-классы по WSDL-описанию SOAP-сервисаЭто WSDL-описание дается в руководстве программиста и недоступно по ссылке ?wsdl

283