Initialisation de HashSet au moment de la construction

Initialisation de HashSet au moment de la construction

1. Vue d'ensemble

Dans ce rapide didacticiel, nous présenterons différentes méthodes deinitializing the HashSet with values, at the time of its construction.

Si vous cherchez plutôt à explorer les fonctionnalités deHashSet, reportez-vous àthis core article here.

Nous allons plonger dans Javabuilt-in methods since Java 5 and before suivi des nouveauxmechanism introduced since Java 8. Nous allons également voir uncustom utility method et enfin explorer les fonctionnalités fournies par3rd party collection libraries, Google Guava en particulier.

Si vous êtes chanceux d'avoir déjà migré vers JDK9 +, vous pouvez simplement utilisercollection factory methods.

2. Méthodes intégrées Java

Commençons par examiner troismechanisms available since the Java 5 or before intégrés.

2.1. Utiliser une autre instance de collection

On peut passer uninstance of another collection existant pour initialiser lesSet. Dans l'exemple ci-dessous, nous utilisons unList créé en ligne:

Set set = new HashSet<>(Arrays.asList("a", "b", "c"));

2.2. Utiliser la classe anonyme

Dans une autre approche encore, nous pouvons utiliser la classe anonyme pour ajouter un élément àHashSet.

Notez l'utilisation de doubles accolades. Cette approche esttechnically very expensive car elle crée une classe anonyme à chaque fois qu’elle est appelée.

Donc, en fonction de la fréquence à laquelle nous devons initialiserSet, nous pouvonstry to avoid using this approach:

Set set = new HashSet(){{
    add("a");
    add("b");
    add("c");
}};

2.3. Utilisation de la méthode de l'utilitaire de collections depuis Java 5

La classeCollections utility de Java fournit la méthode nomméesingleton pour créer unSet avec un seul élément. L'instanceSet créée avec la méthodesingleton estimmutable signifiant que nous ne pouvons pas y ajouter plus de valeurs.

Il existe des situations en particulier dans les tests unitaires où nous devons créer unSet avec une seule valeur:

Set set = Collections.singleton("a");

3. Définition de la méthode de l'utilitaire personnalisé

Nous pouvons définir une méthodestatic final comme ci-dessous. La méthodeaccepts variable arguments.

L'utilisation deCollections.addAll qui accepte l'objet de collection et un tableau de valeurs estbest among others en raison de la faible surcharge de la copie des valeurs.

Lesmethod is using generics afin que nous puissions passer des valeurs de tout type:

public static final  Set newHashSet(T... objs) {
    Set set = new HashSet();
    Collections.addAll(set, objs);
    return set;
}

La méthode utilitaire peut être utilisée dans notre code comme ci-dessous.

Set set = newHashSet("a","b","c");

4. Utilisation deStream depuis Java 8

Avec l'introduction de l'APIStream dans Java 8, nous avons des options supplémentaires. Nous pouvons utiliserStream with Collectors comme indiqué dans le code ci-dessous:

Set set = Stream.of("a", "b", "c")
  .collect(Collectors.toCollection(HashSet::new));

5. Utilisation d'une bibliothèque de collection tierce

Il existe de nombreuses bibliothèques de collections tierces, notamment Google Guava, Apache Commons Collections et Eclipse Collections.

Ces bibliothèques fournissent des méthodes utilitaires pratiques pour initialiser des collections telles que Set. PuisqueGoogle Guava est l'un des plus couramment utilisés ici, nous en avons un exemple. Le Guava a des méthodes pratiques pour les objetsSet mutables et immuables:

Set set = Sets.newHashSet("a", "b", "c");

De même, Guava a une classe utilitaire pour créer desimmutable Set instances, comme nous pouvons le voir dans l'exemple ci-dessous.

Set set = ImmutableSet.of("a", "b", "c");

6. Conclusion

En conclusion, nous avons vu de multiples façons dont unHashSet peut être initialisé pendant sa construction. Ces approches ne couvrent pas nécessairement tous les moyens possibles. C'était juste une tentative de présenter les moyens les plus courants.

Une telle approche non couverte ici pourrait être l'utilisation du générateur d'objets pour construire unSet.

Comme toujours, un exemple de code fonctionnel est disponibleover on GitHub.