CharSequence vs. String en Java

CharSequence vs. Chaîne en Java

1. introduction

En termes simples,CharSequence etString 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 imposé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 = "example";

Ici,charSequence est instancié avec unString. Instanciant d'autres implémentations:

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

3. String

String 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 interfacesCharSequence,Serializable etComparable<String>.

Sous les deux instanciations, créez desStrings avec le même contenu. Cependant, ils ne sont pas égaux entre eux:

@Test
public void givenUsingString_whenInstantiatingString_thenWrong() {
    CharSequence firstString = "example";
    String secondString = "example";

    assertNotEquals(firstString, secondString);
}

4. CharSequence contre String

Comparons les différences et les points communs deCharSequence etString. Ils résident tous les 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 classeString 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 lesString: les plus récemment créés

@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 lesString déjà créés 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 classeString implémente l'interfaceComparable<String>.

Pour comparer deuxCharSequences, nous pouvons les convertir enStrings puis les comparer ultérieurement:

@Test
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
    CharSequence charSeq1 = "example_1";
    CharSequence charSeq2 = "example_2";

    assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);
}

5. Conclusion

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

Vous pouvez trouver plus d'informations dans JavaDocs surCharSequence etString.

Et, comme toujours, l'implémentation de tous ces exemples et extraits de code peut être trouvéeover on Github.