Eclipse Debugger: представление переменных при использовании вложенных Java HashMap, ArrayList - PullRequest
0 голосов
/ 02 марта 2012

EDIT2: Хорошо, это наиболее похоже на проблему с Eclipse Debugger. добавление следующего кода дает то, что я ожидал. Таким образом, нет странного поведения кода, только отладчик заставляет меня думать, был один. (Eclipse Indigo Build id 20110615-0604)

Object bla1 = map.get("String3");
Object bla2 = map.get("String4");
Object bla3 = map.get("String1");
Object bla4 = map.get("String2");
Object bla5 = map.get("innerMap");
Object bla6 = map.get("list");

РЕДАКТИРОВАТЬ: Это не проблема заказа! Я знаю, что такое HashMap, и мне нет дела до порядка. Проблема в том, что put ("list", list) не будет создавать новую запись в HashMap, она перезаписывает старую. put ("liste", list) добавит новую запись. Ни записи "списка", ни "списка" не существуют во время добавления. Пожалуйста, не говорите мне «Ты новичок», я не отлаживал пример кода (используя jdk1.6.0_24).

Я использую jdk1.6.0_24 в качестве среды выполнения и столкнулся с проблемой, которая мне кажется очень странной:

    List<Object> list = new ArrayList<Object>();
    list.add("A String 5");
    list.add("A String 6");

    Map<String, Object> aMap = new HashMap<String, Object>();
    aMap.put("String7", "A String 7");
    aMap.put("String8", "A String 8");
    list.add(aMap);

    Map<String, Object> innerMap = new HashMap<String, Object>();
    innerMap.put("newString", "Yet another new String");
    innerMap.put("bool", false);
    innerMap.put("long", 3L);
    innerMap.put("Integer", 3);

    List<Object> anotherList = new ArrayList<Object>();
    anotherList.add(1);
    anotherList.add(1L);
    anotherList.add("Another String");
    anotherList.add(true);

    List<Object> aList = new ArrayList<Object>();
    aList.add(2);
    aList.add(2L);
    aList.add("Yet Another String");
    aList.add(false);

    anotherList.add(aList);

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("String3", "A String 3");
    map.put("String4", "A String 4");
    map.put("String1", "A String 1");
    map.put("String2", "A String 2");
    map.put("innerMap", innerMap);
    map.put("list", list); //here it happens
    //map.put("list0", list); //here it happens also
    //map.put("list1", list); //here it happens also
    //map.put("list2", list); //this will work, when you use this line and comment out all 'here it happens' lines
    map.put("anotherList", anotherList);

В зависимости от значения ключа новой записи, список объектов (который представляет собой ArrayList) обрабатывается так, как я ожидаю (добавляется на карту в новой позиции), или: список будет добавлен на карту в позиции, где один из ранее добавленных предметов был уже сидящий. Уже существующий объект не перезаписывается, он доступен через следующую.

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

Ответы [ 3 ]

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

Вы говорите о порядке итерации карты? Для HashMap порядок итераций не указан и, вероятно, будет довольно случайным (что, конечно, на самом деле не так, просто вы не можете легко увидеть порядок на первый взгляд, поскольку он зависит от хеш-значений объектов); если вам нужен гарантированный заказ, используйте SortedMap, например TreeMap.

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

Ключи HashMap не имеют предсказуемого порядка. Если вы хотите сохранить порядок вставки, используйте LinkedHashMap, если вы хотите, чтобы ключи упорядочены (естественный порядок), тогда ищите TreeMap (оба являются частью Collection API)

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

Последнее предложение первого абзаца.

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

Похоже, вы новичок в Java. Познакомьтесь с Javadoc и используйте его постоянно, это ваш друг.

...