Подтвердить что ты не робот

Map.of() vs. Collections.emptyMap()

Существует ли разница между Map.of() и Collections.emptyMap() между List.of() и Collections.emptyList() и между Set.of() и Collections.emptySet()?

4b9b3361

Ответ 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>);