Ключи и значения JAVA HashMap равны нулю, но они не находятся [на удержании]

Мои HashMap дают мне null для любого ключа или значения, хотя они вовсе не равны нулю.

У меня есть HashMap<String, String> PLATE, который находится внутри CopyOnWriteArrayList<HashMap<String, String>> PLATES. ТАБЛИЧКА заполнена несколькими ключами и значениями. Когда я перебираю PLATE с помощью entrySet().iterator(), я получаю все правильные ключи с их значениями, НО, когда я пытаюсь PLATE.get("someKey") значениям напрямую по определенному ключу, я всегда получаю ноль.

Я вызываю ключи и значения PLATE с помощью итератора и прямого get() ПРАВО ПОСЛЕ ОДНОГО ДРУГОГО - то есть, абсолютно нет изменений в PLATE между операциями - итератор выдает правильный вывод, но get() считает все равно нулю (ключи и значения).

Мой код итератора выглядит следующим образом:

public static void iterateHashMap(HashMap HM) {
    Iterator it = HM.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry) it.next();
        System.out.println(new StringBuilder("'" + pair.getKey() + "' = '" + pair.getValue() + "'").toString());
        it.remove();
    }
}

Поэтому, когда я звоню:

for (HashMap<String, String> PLATE : PLATES) {
    iterateHashMap(PLATE);
    System.out.println("\nhash = " + PLATE.get("hash"));
}

Вывод выглядит так:

'abc' = 'Material ORANGE'
'def' = '3811'
'hash' = 'JGcS4Cc6lpka'

hash = null

У меня есть Понятия не имею, почему это происходит, так как я ожидаю, что когда я вызову ключ напрямую с помощью get(), я получу его значение вместо нуля.

КСТАТИ , как некоторые из вас утверждают, что it.remove() каким-то образом манипулирует PLATE, это не так, как я мог бы получить значение NULL также, если бы я назвал только этот прямой get() вызов.

СЛУЧАЙ ЗАКРЫТ: это была моя испорченная установка NetBeans 8, которая выдала мне неверный вывод в окне вывода - после переустановки все работает как надо, извините, ребята ...

-10
задан Anka Petkova 5 September 2019 в 09:59
поделиться

1 ответ

Я поместил Ваш код в свой IDE и сделал удаление дополнительным. Настоящим код и вывод, я также зафиксировал некоторые недостающие дженерики и использовал интерфейсы вместо реальных классов когда это применимо.

, Как предложено в более раннем отключении комментариев удаляют, решает вопрос.

РЕДАКТИРОВАНИЕ : как отвечено Вами проблемы были вызваны путем кэширования в Выводе IDE

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

class Scratch {
    private static final List<Map<String, String>> PLATES = init();

    private static List<Map<String, String>> init() {
        Map<String, String> map = new HashMap<>();
        map.put("abc", "Material ORANGE");
        map.put("def", "3811");
        map.put("hash", "JGcS4Cc6lpka");

        return new CopyOnWriteArrayList<>(Arrays.asList(map));
    }

    public static void main(String[] args) {
        for (Map<String, String> PLATE : PLATES) {
            iterateHashMap(PLATE, false);
            System.out.println("\nhash = " + PLATE.get("hash"));
            System.out.println();
            iterateHashMap(PLATE, true);
            System.out.println("\nhash = " + PLATE.get("hash"));
        }
    }

    public static void iterateHashMap(Map<String, String> HM, boolean doRemove) {
        Iterator<Map.Entry<String, String>> it = HM.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> pair = it.next();
            System.out.println("'" + pair.getKey() + "' = '" + pair.getValue() + "'");
            if (doRemove) {
                it.remove();
            }
        }
    }

}

:

'abc' = 'Material ORANGE' 
'def' = '3811' 
'hash' = 'JGcS4Cc6lpka'

hash = JGcS4Cc6lpka

'abc' = 'Material ORANGE' 
'def' = '3811' 
'hash' = 'JGcS4Cc6lpka'

hash = null

Process finished with exit code 0
1
ответ дан Martin van Wingerden 7 September 2019 в 06:31
поделиться
  • 1
    Upvoted, потому что это - корректное решение JPA вместо того, чтобы быть, в спящем режиме конкретные. Однако allocationSize=1 означает, что число должно быть получено из базы данных для каждой вставки вместо того, чтобы кэшировать много Ids сразу, таким образом, это идет с очень маленьким снижением производительности. – shonky linux user 30 July 2013 в 23:58
Другие вопросы по тегам:

Похожие вопросы: