Concaténation de chaînes en Java

1. Introduction

Java fournit un nombre important de méthodes et de classes dédiées à la concaténation de chaînes.

Dans ce didacticiel, nous allons plonger dans plusieurs d'entre eux et décrire quelques pièges courants et mauvaises pratiques.

2. StringBuilder

Le premier est l'humble StringBuilder. Cette classe offre un éventail de String- utilitaires construction qui rend le travail facile de cordes manipulation.

Construisons un exemple rapide de concaténation de chaînes à l'aide de la classe StringBuilder :

StringBuilder stringBuilder = new StringBuilder(100); stringBuilder.append("Baeldung"); stringBuilder.append(" is"); stringBuilder.append(" awesome"); assertEquals("Baeldung is awesome", stringBuilder.toString());

En interne, StringBuilder gère un tableau de caractères mutable. Dans notre exemple de code, nous avons déclaré que cela avait une taille initiale de 100 via le constructeur StringBuilder . En raison de cette déclaration de taille, le StringBuilder peut être un moyen très efficace de concaténer des chaînes .

Il convient également de noter que la classe StringBuffer est la version synchronisée de StringBuilder .

Bien que la synchronisation soit souvent synonyme de sécurité des threads, son utilisation dans les applications multithreads n'est pas recommandée en raison du modèle de générateur de StringBuffer . Alors que les appels individuels à une méthode synchronisée sont thread-safe, les appels multiples ne le sont pas.

3. Opérateur d'addition

Ensuite, il y a l'opérateur d'addition (+). Il s'agit du même opérateur qui entraîne l'ajout de nombres et qui est surchargé pour concaténer lorsqu'il est appliqué à des chaînes.

Jetons un rapide coup d'œil à comment cela fonctionne:

String myString = "The " + "quick " + "brown " + "fox..."; assertEquals("The quick brown fox...", myString);

À première vue, cela peut sembler beaucoup plus concis que l' option StringBuilder . Cependant, lorsque le code source se compile, le symbole + se traduit par des chaînes d' appels StringBuilder.append () . Pour cette raison, mélanger la méthode StringBuilder et + de concaténation est considéré comme une mauvaise pratique .

De plus, la concaténation de chaînes utilisant l'opérateur + dans une boucle doit être évitée. Étant donné que l' objet String est immuable, chaque appel de concaténation entraînera la création d'un nouvel objet String .

4. Méthodes de chaîne

La classe String elle-même fournit toute une série de méthodes pour concaténer des chaînes.

4.1. String.concat

Sans surprise, la méthode String.concat est notre premier port d'appel lors de la tentative de concaténation d' objets String . Cette méthode renvoie un objet String , donc le chaînage de la méthode est une fonctionnalité utile.

String myString = "Both".concat(" fickle") .concat(" dwarves") .concat(" jinx") .concat(" my") .concat(" pig") .concat(" quiz"); assertEquals("Both fickle dwarves jinx my pig quiz", myString);

Dans cet exemple, notre chaîne est démarrée avec un littéral String , la méthode concat nous permet ensuite d'enchaîner les appels pour ajouter d'autres chaînes .

4.2. String.format

La prochaine étape est la méthode String.format , qui nous permet d'injecter une variété d' objets Java dans un modèle String .

La signature de la méthode String.format prend une seule chaîne indiquant notre modèle . Ce modèle contient des caractères '%' pour représenter où les différents objetsdevrait y être placé .

Une fois notre modèle déclaré, il prend alors un tableau d' objet varargs qui est injecté dans le modèle.

Voyons comment cela fonctionne avec un exemple rapide:

String myString = String.format("%s %s %.2f %s %s, %s...", "I", "ate", 2.5056302, "blueberry", "pies", "oops"); assertEquals("I ate 2.51 blueberry pies, oops...", myString);

Comme nous pouvons le voir ci-dessus, la méthode a injecté nos chaînes dans le format correct.

4.3. String.join (Java 8+)

Si notre application fonctionne sur Java 8 ou supérieur , nous pouvons profiter de la méthode String.join . Avec cela, nous pouvons joindre un tableau de chaînes avec un délimiteur commun , garantissant qu'aucun espace n'est manqué.

String[] strings = {"I'm", "running", "out", "of", "pangrams!"}; String myString = String.join(" ", strings); assertEquals("I'm running out of pangrams!", myString); 

Un énorme avantage de cette méthode est de ne pas avoir à se soucier du délimiteur entre nos chaînes.

5. StringJoiner (Java 8+)

StringJoiner résume toutes les fonctionnalités String.join dans une classe simple à utiliser. Le constructeur prend un délimiteur, avec un préfixe et un suffixe facultatifs . Nous pouvons ajouter des chaînes en utilisant la méthode add bien nommée .

StringJoiner fruitJoiner = new StringJoiner(", "); fruitJoiner.add("Apples"); fruitJoiner.add("Oranges"); fruitJoiner.add("Bananas"); assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());

By using this class, instead of the String.join method, we can append Strings as the program runs; There's no need to create the array first!

Head over to our article on StringJoiner for more information and examples.

6. Arrays.toString

On the topic of arrays, the Array class also contains a handy toString method which nicely formats an array of objects. The Arrays.toString method also calls the toString method of any enclosed object – so we need to ensure we have one defined.

String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; String toString = Arrays.toString(myFavouriteLanguages); assertEquals("[Java, JavaScript, Python]", toString);

Unfortunately, the Arrays.toString method is not customizable and only outputs a String encased in square brackets.

7. Collectors.joining (Java 8+)

Finally, let's take a look at the Collectors.joining method which allows us to funnel the output of a Stream into a single String.

List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); assertEquals("Shark, Panda, Armadillo", animalString);

Using streams unlocks all of the functionality associated with the Java 8 Stream API, such as filtering, mapping, iterating and more.

8. Wrap Up

In this article, we've taken a deep dive into the multitude of classes and methods used to concatenate Stringsin the Java language.

Comme toujours, le code source est disponible à l'adresse over sur GitHub.