Maison  >  Article  >  Java  >  StringBuilder n'est plus nécessaire pour concaténer des chaînes dans Java 8

StringBuilder n'est plus nécessaire pour concaténer des chaînes dans Java 8

巴扎黑
巴扎黑original
2017-04-30 10:13:201745parcourir

Parmi les développeurs Java, la consommation élevée de ressources pour l'épissage de chaînes est souvent un sujet brûlant.

Discutons en profondeur des raisons pour lesquelles cela nécessite autant de ressources.

En Java, un objet chaîne est immuable, ce qui signifie qu’une fois créé, vous ne pouvez pas le modifier. Ainsi, lorsque nous concaténons des chaînes, une nouvelle chaîne est créée et l'ancienne est marquée par le ramasse-miettes.

Si nous traitons des millions de chaînes, nous générerons des millions de chaînes supplémentaires qui seront traitées par le garbage collector.

La couche inférieure de la machine virtuelle effectue de nombreuses opérations lors de l'épissage des chaînes. L'opérateur point le plus direct pour concaténer des chaînes est l'opération String#concat(String).

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}
public static char[] copyOf(char[] original, int newLength) {
    char[] copy = new char[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}

Vous pouvez voir qu'un tableau de caractères est créé et que la longueur est la somme de la longueur des caractères existants et des caractères concaténés. Leurs valeurs sont ensuite copiées dans un nouveau tableau de caractères. Enfin, créez un objet String à partir de ce tableau de caractères et renvoyez-le.

Ces opérations sont donc nombreuses. Si vous le calculez, vous constaterez que la complexité est O(n^2).

​Pour résoudre ce problème, nous utilisons la classe StringBuilder. C'est comme une classe String mutable. La méthode d’épissage nous aide à éviter les duplications inutiles. Il a une complexité de O(n), ce qui est bien meilleur que O(n^2).

Cependant, Java 8 utilise StringBuilder pour concaténer les chaînes par défaut.

Documentation Java 8 :

Afin d'améliorer les performances de concaténation de chaînes, le compilateur Java peut utiliser la classe StringBuffer ou une technologie similaire pour réduire la création d'objets String intermédiaires lors de l'utilisation d'expressions d'évaluation.

Le compilateur Java gère cette situation :

public class StringConcatenateDemo {
  public static void main(String[] args) {
     String str = "Hello ";
     str += "world";
   }
}

Le code ci-dessus sera compilé dans le bytecode suivant :

public class StringConcatenateDemo {
  public StringConcatenateDemo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String Hello
       2: astore_1
       3: new           #3                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      10: aload_1
      11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: ldc           #6                  // String world
      16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: astore_1
      23: return
}

​Vous pouvez voir dans ces bytecodes que StringBuilder est utilisé. Nous n'avons donc plus besoin d'utiliser la classe StringBuilder dans Java 8.

Texte original en anglais : Nous n'avons plus besoin de StringBuilder pour la concaténation

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn