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




java-9 (2)

Non. En termes de signature, les deux méthodes retournent un type immuable de List / Map / Set . Les Javadocs pour les deux états comparés sont les mêmes:

Collections.emptyMap()

Renvoie une carte vide (immutable). Cette carte est sérialisable.

Map.of()

Renvoie une carte immuable contenant des mappages zéro

Oui. en termes de leur mise en œuvre, par exemple:

Collections.emptyMap ()

public static final Map EMPTY_MAP = new EmptyMap<>();

renvoie une Map type brut tandis que d'un autre côté

Carte de()

private static final Map0<?,?> INSTANCE = new Map0<>();

renvoie un type Map0<?,?> qui est introduit dans Java 9 lui-même pour l'utilisation interne et l'implémentation des méthodes Static Factory. qui indique que les instances de carte créées par ces méthodes ont les caractéristiques suivantes:

  • Ils sont structurellement immuables . Les clés et les valeurs ne peuvent pas être ajoutées, supprimées ou mises à jour. L'appel de toute méthode mutator entraînera toujours le lancement de UnsupportedOperationException. Toutefois, si les clés ou les valeurs contenues sont elles-mêmes modifiables, le comportement de la carte peut être incohérent ou son contenu peut sembler changer.

  • Ils interdisent les clés et les valeurs nulles. Les tentatives de les créer avec des clés ou des valeurs null aboutissent à NullPointerException .

  • Ils sont sérialisables si toutes les clés et valeurs sont sérialisables.

  • Ils rejettent les clés en double lors de la création. Les clés en double passées à une méthode d'usine statique aboutissent à IllegalArgumentException .

  • L'ordre d'itération des mappages n'est pas spécifié et peut être modifié.

  • Ils sont basés sur la valeur. Les appelants ne doivent faire aucune supposition sur l'identité des instances renvoyées. Les usines sont libres de créer de nouvelles instances ou de réutiliser celles qui existent déjà. Par conséquent, les opérations sensibles à l'identité sur ces instances (égalité de référence (==), code de hachage d'identité et synchronisation) ne sont pas fiables et doivent être évitées.

  • Ils sont sérialisés comme indiqué sur la page Formulaire sérialisé.

Remarque - Je n'ai partagé que l'échantillon pour Map , bien qu'il en soit de même pour Set et List avec des limites différentes pour les méthodes statiques.

Y a-t-il une différence entre Map.of() et Collections.emptyMap() , entre List.of() et Collections.emptyList() et entre Set.of() et Collections.emptySet() ?


Oui , il existe même des différences comportementales et non techniques entre les collections renvoyées par les méthodes factory emptyXyz dans la classe Collections et les nouvelles méthodes factory introduites dans les interfaces ( Map , List , Set ) avec JDK 9, si celles-ci sont invoquées avec pas d'arguments.

La différence pertinente est que les collections retournées par les nouvelles méthodes d'usine interdisent null clés et les valeurs null (comme indiqué dans la documentation de l'API dans les interfaces List , Set et Map ). Cela peut sembler inutile pour les collections vides, mais même si cela n'est pas clairement documenté, même les méthodes d'accès dans les nouvelles implémentations de collection vérifient les valeurs nulles.

Quelques exemples des différences:

Collections.emptyList().contains(null) List.of().contains(null) Collections.emptyList().contains(null) retournera false, tandis que List.of().contains(null) lancera une NullPointerException .

Collection.emptyMap().getOrDefault(null, V) retournera V , alors que Map.of().getOrDefault(null, V) lancera une NullPointerException .

Comme actuellement implémenté dans Oracle JDK 9, au moins les méthodes suivantes sur les collections retournées par les nouvelles méthodes factory lanceront NullPointerException , mais se comporteront 'sanely' (comme dans la façon dont les classes de collection ont été conçues et spécifiées pour supporter les clés et valeurs null ) en utilisant les anciennes méthodes d'usine de la classe Collections :

  • List.of().contains(null);
  • Set.of().contains(null);
  • Map.of().containsKey(null);
  • Map.of().containsValue(null);
  • Map.of().getOrDefault(null, <any>);




java-9