Nombre d’objects créés lors de la concaténation de chaînes

Quelqu’un peut-il me dire combien d’objects seront créés lors de l’exécution de l’instruction System.out.println dans le code ci-dessous

 int i=0; int j=1; System.out.print("i value is "+ i + "j value is "+j); 

Si vous voulez vraiment savoir ce qui se passe, pourquoi ne pas regarder le bytecode?

J’ai enveloppé votre code dans une fonction principale, l’ai compilé, puis désassemblé avec javap -c Test.class . Voici le résultat (à l’aide d’un compilateur Oracle Java 7):

 Comstackd from "Test.java" class Test { Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(java.lang.Ssortingng[]); Code: 0: iconst_0 1: istore_1 2: iconst_1 3: istore_2 4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 7: new #3 // class java/lang/SsortingngBuilder 10: dup 11: invokespecial #4 // Method java/lang/SsortingngBuilder."":()V 14: ldc #5 // Ssortingng i value is 16: invokevirtual #6 // Method java/lang/SsortingngBuilder.append:(Ljava/lang/Ssortingng;)Ljava/lang/SsortingngBuilder; 19: iload_1 20: invokevirtual #7 // Method java/lang/SsortingngBuilder.append:(I)Ljava/lang/SsortingngBuilder; 23: ldc #8 // Ssortingng j value is 25: invokevirtual #6 // Method java/lang/SsortingngBuilder.append:(Ljava/lang/Ssortingng;)Ljava/lang/SsortingngBuilder; 28: iload_2 29: invokevirtual #7 // Method java/lang/SsortingngBuilder.append:(I)Ljava/lang/SsortingngBuilder; 32: invokevirtual #9 // Method java/lang/SsortingngBuilder.toSsortingng:()Ljava/lang/Ssortingng; 35: invokevirtual #10 // Method java/io/PrintStream.print:(Ljava/lang/Ssortingng;)V 38: return } 

Le seul object qui est alloué dans cette méthode est le SsortingngBuilder (par la new instruction en position 7). Cependant, les autres méthodes invoke d pourraient allouer quelque chose elles-mêmes, et je soupçonne fort que SsortingngBuilder.toSsortingng affectera un object Ssortingng .

Cela créera un object SsortingngBuilder (et tout ce que cet object utilisera en interne), appenda les valeurs et finalement, SsortingngBuilder créera un object Ssortingng avec le résultat.

Le code

 int i=0; int j=1; System.out.print("i value is "+ i + "j value is "+j); 

Crée 3 objects.

Ma raison:

Les types de données de base en Java ne sont pas des objects et n’héritent pas d’Object. so int i=0; and int j=1; int i=0; and int j=1; ne fait pas un object.

Maintenant, System.out.print("i value is "+ i + "j value is "+j); qui contient Ssortingng qui sont immuables, et les opérations sur ssortingng sont coûteuses. Nous pouvons fractionner les opérations comme ceci.

 ("i value is ").concat(i) // creates one object let say obj1 obj1.concat("j value is ") //creates another let say obj2 obj2.concat(j) // creates the final ssortingng let say obj3; 

Dans un exemple, l’opération de chaîne str1.concat(str2) est réalisée à l’aide de deux objects Ssortingng. Elle crée le troisième et modifie la référence en créant l’illusion que c’est en fait le premier object chaîne, à savoir str1. Ainsi, str1 aura une nouvelle chaîne contenant la valeur de l’ancienne str1 et la str2 concaténée.

C’est ce que je crois avec mes connaissances limitées. Corrigez-moi si je me trompe.

Seulement 1 , l’object Ssortingng est concaténé.

Seulement 1 c’est-à-dire pour imprimer la chaîne.

Règle du pouce – Chaque fois que la concaténation de chaînes est terminée, un nouvel object est créé.

Le code est converti, par le compilateur, en quelque chose comme ceci:

 int i=0; int j=1; SsortingngBuilder temp = new SsortingngBuilder(); // creates a SsortingngBuilder temp.append("i value is "); // creates or re-uses a Ssortingng temp.append(i); // might create a Ssortingng temp.append("j value is"); // creates or re-uses a Ssortingng temp.append(j); // might create a Ssortingng Ssortingng temp2 = temp.toSsortingng(); // creates a Ssortingng System.out.print(temp2); 

Cela dépend si vous comptez les chaînes “i value is” et “j value is”, qui sont créées une fois, puis réutilisées.

Si vous les comptez, alors au moins 4, sinon au moins 2.

En réalité, chaque chaîne a son propre caractère [] qui stocke la chaîne. Donc, c’est 7 ou 3, au lieu de 4 ou 2.

SsortingngBuilder a également un caractère [] et pourrait devoir créer de nouveaux caractères [] à mesure que vous ajoutez des données. Ssortingng.valueOf ou System.out.print peuvent également créer des objects derrière votre dos et il est impossible de les connaître sans outils externes. D’où “au moins”.

S’il dépend effectivement de la mise en œuvre, il est évalué comme suit:

 SsortingngBuilder sb = new SsortingngBuilder("i value is "); sb.append(i); sb.append(j); Ssortingng newStr = sb.toSsortingng(); 

Il y aura 2 objects.

La chaîne est immuable signifie que vous ne pouvez pas modifier l’object lui-même.
Lors de la concaténation à chaque fois que de nouveaux objects chaîne sont créés.
Donc, dans l’exemple ci-dessus

  1. int i
  2. int j
  3. “i value is”
  4. “i value is” + i
  5. “i valeur est” + i + “j valeur est”
  6. “i valeur est” + i + “j valeur est” + j

Un total de six objects est créé dans l’exemple ci-dessus.

5 objects

  1. “i value is” .Un object Ssortingng sera formé.
  2. “i value is” + i . Cette opération de concaténation formera le 2e object.
  3. “j value is” formera le troisième object.
  4. “i valeur est” + i + “j valeur est” .4ème object formé à cause de la concaténation.
  5. “i valeur est” + i + “j valeur est” + j. Cette dernière concaténation formera le 5ème object.