Разница в Java-коллекции между JDK 6 и JDK8

Мне было интересно, изменилась ли реализация java.util.collections между Java 6 и Java 8. У меня есть этот тест, который отлично работает в Java 6, но не в Java 8

Set<String> types = new HashSet<String>();
String result;
types.add("BLA");
types.add("TEST");

Результат в Java 6: [BLA, TEST] Результат в Java 8: [TEST, BLA] Я уже просматривал документацию и заметки о выпуске JDK 7 и JDK 8, но не нашел никакой разницы между JDK 6 и двумя другие по этому поводу. Заранее спасибо за разъяснения.

2 ответа

Решение

У вас нет причин ожидать [BLA, TEST] выводится либо в JDK6, либо в JDK8, поскольку Javadoc не обещает вам элементов HashSet будет напечатан в соответствии с порядком вставки (или любым порядком). Разным реализациям разрешено производить разные заказы.

Если вы хотите обеспечить вывод в обоих JDK, используйте LinkedHashSet, который поддерживает порядок вставки:

Set<String> types = new LinkedHashSet<String>();
String result;
types.add("BLA");
types.add("TEST");
System.out.println (types);

распечатает

[BLA, TEST]

в обеих версиях.

Кстати, этот вывод также не гарантируется Javadoc, поэтому его можно рассматривать как подробности реализации, которые могут измениться в будущих версиях, но с меньшей вероятностью изменятся. Причина этого вывода в том, что AbstractCollection"s toString() (что является реализацией HashSet а также LinkedHashSet use) перечисляет элементы в порядке их возврата итератором.

Строка java.util.AbstractCollection.toString()

Возвращает строковое представление этой коллекции. Строковое представление состоит из списка элементов коллекции в том порядке, в котором они возвращаются ее итератором, заключенных в квадратные скобки ("[]"). Смежные элементы разделяются символами ", " (запятая и пробел). Элементы преобразуются в строки как String.valueOf(Object).

Реализация изменилась, но кого это волнует? Вы имеете дело с HashSet эти документы как не имеющие порядка полагаться. Поэтому простая печать ничего не делает, просто показывает, что все элементы есть.

В java-9 Set#of а также Map#of (новые коллекции) не имеют определенного порядка, например, от запуска к запуску. Порядок не определен == не полагайтесь на него.

Другие вопросы по тегам