Parmi les développeurs Java, la consommation élevée de ressources de l'épissage de chaînes est souvent un sujet brûlant
Discutons en profondeur des raisons pour lesquelles il occupe des ressources élevées.
En Java, un StringObject 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, alors 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 la longueur est la somme des caractères existants et de la longueur des caractères épissé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.
La documentation pour Java 8 indique :
Afin d'améliorer les performances de concaténation de chaînes, le compilateur Java peut utiliser la classe StringBuffer ou une technologie similaire. Réduisez la création d’objets String intermédiaires lorsque la valeur expression .
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 Comme vu dans ces bytecodes, StringBuilder est utilisé. Nous n'avons donc plus besoin d'utiliser la classe StringBuilder dans Java 8.
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!