java - 以下创建了几个对象
PHP中文网
PHP中文网 2017-04-18 10:23:06
0
3
844

String a,b,c;
a = "a";
b = "b";
a = a+b;
StringBuffer d = new StringBuffer("abc");
d = d.append("567");

我觉得是6个,"a" "b" "ab" "abc" "567" 还有d.

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(3)
小葫芦

Dites-moi votre compréhension et vous êtes invités à faire des suggestions

  • a = "a" ; Lors de la compilation, la chaîne "a" est mise dans le pool constant et aucun objet n'est créé sur le tas

  • b = "b"; De même

  • a = a + b ; crée un objet StringBuilder, append(a), append(b), et enfin renvoie tostring() à a.

  • StringBuffer d = new StringBuffer("abc"); Un objet doit être créé ici, et "abc" entre dans le pool de constantes

  • d = d.append("567"); StringBuffer utilise un tableau de caractères pour enregistrer la chaîne. L'ajout ajoutera "567" au tableau. Si la capacité du tableau n'est pas suffisante, elle sera étendue. La taille par défaut est 16 + La longueur de "abc" = 19, la longueur de "abc567" est 6, 3 + 3 < 19, cela ne provoquera donc pas d'expansion.

  • Un autre point est que StringBuffer et StringBuilder héritent de AbstractStringBuilder, ce qui peut provoquer la création de classes parents.

Voici le code décompilé :

/**
 *
 * 源代码
 *public class TestString {
 *    public static void main(String args[]) {
 *        String a = "a";
 *        String b = "b";
 *        String c = a + b;
 *    }
 *}
 *
 */

Compiled from "TestString.java"
public class TestString {
    public TestString();
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 a
       2: astore_1
       3: ldc           #3                  // String b
       5: astore_2
       6: new           #4                  // class java/lang/StringBuilder
       9: dup
       10: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
       13: aload_1
       14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
        18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
        25: return
}
迷茫

Laissez-moi d'abord vous dire ma réponse : je pense que c'est 3.


Tout d'abord, clarifions la signification spécifique de 创建对象 D'après ma compréhension, si la chaîne est 字符常量, alors l'objet chaîne est déterminé au moment de la compilation et il est stocké dans le pool constant, donc. Cela ne compte pas comme la création d'un objet chaîne. S'il y a une opération telle que String b = new String("abc"), alors on peut considérer qu'un objet chaîne est créé et associé à la variable b.

Selon la définition ci-dessus, il y a alors : "a", "b", "abc", "567" sont tous des constantes, placées dans le pool de constantes, elles ne sont donc pas créées en tant qu'objets.

Alors jetez un œil au code :

Code source :

1: String a,b,c;
2: a = "a";
3: b = "b";
4: a = a+b;
5: StringBuffer d = new StringBuffer("abc");
6: d = d.append("567");
Pour plus de commodité, j'ai numéroté chaque ligne manuellement.

Jetons un coup d'œil au bytecode correspondant :

Code:
  stack=3, locals=5, args_size=1
     0: ldc           #2                  // String a
     2: astore_1
     3: ldc           #3                  // String b
     5: astore_2
     6: new           #4                  // class java/lang/StringBuilder
     9: dup
    10: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
    13: aload_1
    14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    17: aload_2
    18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    24: astore_1
    25: new           #8                  // class java/lang/StringBuffer
    28: dup
    29: ldc           #9                  // String abc
    31: invokespecial #10                 // Method java/lang/StringBuffer."<init>":(Ljava/lang/String;)V
    34: astore        4
    36: aload         4
    38: ldc           #11                 // String 567
    40: invokevirtual #12                 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
    43: astore        4
    45: return
Comme le montre le bytecode, la quatrième ligne du code source

est traduite dans le code suivant : a = a+b

StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
a = builder.toString();
Ensuite un nouvel objet

est créé ici, puis la méthode new StringBuilder() est appelée. Son code source est le suivant : builder.toString().

@Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}
Donc, la méthode

crée un objet String, nous avons donc maintenant créé builder.toString().两个对象

Ensuite, la cinquième ligne

crée sans aucun doute l'objet StringBuffer d = new StringBuffer("abc"), nous avons donc StringBuffer Une chose à noter est que 三个对象 n'appelle pas la méthode StringBuffer d du début à la fin, donc non. Une chaîne redondante sera créée.toString


Résumé :

  • "a": constante de chaîne, non comptée comme objet créé

  • "b": Constante de chaîne, non comptée comme objet créé

  • Objet builder : Créé lors de l'exécution de

    .a = a+b

  • "ab": Créé par

    .StringBuilder.toString()

  • "abc": constante de chaîne, non comptée comme objet créé

  • "567" : Constante de chaîne, non comptée comme objet créé

  • d : Créé par

    .new StringBuffer("abc")

Donc finalement trois objets sont créés.

阿神

Merci pour vos réponses. Je comprends probablement Malheureusement, je ne comprends pas le code décompilé maintenant

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal