CharSequence vs String en Java

1. Introduction

En termes simples, CharSequence et String sont deux concepts fondamentaux différents en Java.

Dans cet article rapide, nous allons examiner les différences entre ces types et quand les utiliser.

2. CharSequence

CharSequence est une interface qui représente une séquence de caractères. La mutabilité n'est pas appliquée par cette interface. Par conséquent, les classes mutables et immuables implémentent cette interface.

Bien entendu, une interface ne peut pas être instanciée directement; il a besoin d'une implémentation pour instancier une variable:

CharSequence charSequence = "baeldung";

Ici, charSequence est instancié avec une chaîne. Instanciation d'autres implémentations:

CharSequence charSequence = new StringBuffer("baeldung"); CharSequence charSequence = new StringBuilder("baeldung");

3. Chaîne

La chaîne est une séquence de caractères en Java. C'est une classe immuable et l'un des types les plus fréquemment utilisés en Java. Cette classe implémente les interfaces CharSequence , Serializable et Comparable .

Sous les deux instanciations, créez des chaînes avec le même contenu. Cependant, ils ne sont pas égaux les uns aux autres:

@Test public void givenUsingString_whenInstantiatingString_thenWrong() { CharSequence firstString = "baeldung"; String secondString = "baeldung"; assertNotEquals(firstString, secondString); }

4. CharSequence vs String

Comparons les différences et les points communs de CharSequence et String . Ils résident tous deux dans le même package nommé java.lang. , mais le premier est une interface et le second est une classe concrète. De plus, la classe String est immuable.

Dans l'exemple suivant, chaque opération de somme crée une autre instance, augmente la quantité de données stockées et renvoie la chaîne la plus récemment créée :

@Test public void givenString_whenAppended_thenUnmodified() { String test = "a"; int firstAddressOfTest = System.identityHashCode(test); test += "b"; int secondAddressOfTest = System.identityHashCode(test); assertNotEquals(firstAddressOfTest, secondAddressOfTest); }

D'autre part, StringBuilder met à jour la chaîne déjà créée pour contenir la nouvelle valeur:

@Test public void givenStringBuilder_whenAppended_thenModified() { StringBuilder test = new StringBuilder(); test.append("a"); int firstAddressOfTest = System.identityHashCode(test); test.append("b"); int secondAddressOfTest = System.identityHashCode(test); assertEquals(firstAddressOfTest, secondAddressOfTest); }

Une autre différence est que l'interface n'implique pas de stratégie de comparaison intégrée, alors que la classe String implémente l' interface Comparable .

Pour comparer deux CharSequence s, nous pouvons les convertir en String s puis les comparer ultérieurement:

@Test public void givenIdenticalCharSequences_whenCastToString_thenEqual() { CharSequence charSeq1 = "baeldung_1"; CharSequence charSeq2 = "baeldung_2"; assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0); }

5. Conclusion

Nous utilisons généralement String dans les endroits où nous ne savons pas quoi utiliser pour les séquences de caractères. Cependant, dans certains cas, StringBuilder et StringBuffer peuvent être plus appropriés.

Vous pouvez trouver plus d'informations dans JavaDocs sur CharSequence et String.

Et, comme toujours, la mise en œuvre de tous ces exemples et extraits de code peut être trouvée sur Github.