Существует ли разница между Map.of() и Collections.emptyMap() между List.of() и Collections.emptyList() и между Set.of() и Collections.emptySet()?
Map.of() vs. Collections.emptyMap()
Ответ 1
Да, существуют даже поведенческие, а не только технические различия между коллекциями, возвращаемыми методами emptyXyz factory в классе Collections и новыми методами of factory введенные в интерфейсы (Map, List, Set) с JDK 9, если они вызываются без аргументов.
Соответствующее различие заключается в том, что коллекции, возвращаемые новыми методами of factory, запрещают null ключи и значения (как указано в документации API в List, Set и Map). Это может звучать безотносительно к пустым коллекциям, но даже если это не совсем четко документировано, даже методы доступа в новых реализациях коллекции проверяют нулевые значения.
Некоторые примеры различий:
Collections.emptyList().contains(null) вернет false, а List.of().contains(null) выкинет NullPointerException.
Collection.emptyMap().getOrDefault(null, V) вернет V, а Map.of().getOrDefault(null, V) выкинет NullPointerException.
Как в настоящее время реализовано в Oracle JDK 9, по крайней мере, следующие методы в коллекциях, возвращаемые новыми методами factory, будут бросать NullPointerException s, но вести себя "безопасно" (как в том, как изначально были разработаны классы коллекции для поддержки нулевых ключей и значений), используя старые методы factory в классе Collections:
-
List.of().contains(null); -
Set.of().contains(null); -
Map.of().containsKey(null); -
Map.of().containsValue(null); -
Map.of().getOrDefault(null, <any>);