Разница в 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
(новые коллекции) не имеют определенного порядка, например, от запуска к запуску. Порядок не определен == не полагайтесь на него.