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

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级讲师

membalas semua(3)
小葫芦

Beritahu saya pemahaman saya, dan anda dialu-alukan untuk membuat cadangan

  • a = "a"; Apabila menyusun, rentetan "a" dimasukkan ke dalam kolam malar dan tiada objek dicipta pada timbunan

  • b = "b"; Begitu juga

  • a = a + b; objek StringBuilder baharu, tambah(a), tambah(b) dan akhirnya kembalikan ke rentetan() kepada a.

  • StringBuffer d = new StringBuffer("abc"); Objek mesti dibuat di sini dan "abc" memasuki kolam malar

  • d = d.append("567"); StringBuffer menggunakan tatasusunan char untuk menyimpan rentetan akan menambah "567" pada tatasusunan itu tidak mencukupi. Saiz lalai ialah 16 + Panjang "abc" = 19, panjang "abc567" ialah 6, 3 + 3 &lt 19, jadi ia tidak akan menyebabkan pengembangan.

  • Perkara lain ialah StringBuffer dan StringBuilder mewarisi AbstractStringBuilder, yang boleh menyebabkan penciptaan kelas induk.

Ini ialah kod yang dinyahkompilasi:

/**
 *
 * 源代码
 *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
}
迷茫

Biar saya beritahu anda jawapan saya dahulu: Saya rasa ia adalah 3.


Pertama sekali, mari kita jelaskan maksud khusus 创建对象 Mengikut pemahaman saya, jika rentetan itu 字符常量, maka objek rentetan ditentukan pada masa penyusunan, dan ia disimpan dalam kolam malar, jadi. Ia tidak dikira sebagai mencipta objek rentetan Jika terdapat operasi seperti String b = new String("abc"), maka ia boleh dianggap bahawa objek rentetan dicipta dan dikaitkan dengan pembolehubah b

Mengikut takrifan di atas, maka terdapat: "a", "b", "abc", "567" semuanya pemalar, diletakkan dalam kolam pemalar, jadi ia tidak dicipta sebagai objek.

Kemudian lihat pada kod:

Kod sumber:

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");
Untuk kemudahan, saya menomborkan setiap baris secara manual.

Mari kita lihat kod bait yang sepadan:

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
Seperti yang dapat dilihat daripada kod bait, baris keempat kod sumber

diterjemahkan ke dalam kod berikut: a = a+b

StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
a = builder.toString();
Kemudian objek baharu

dicipta di sini, dan kemudian kaedah new StringBuilder() dipanggil kod sumbernya adalah seperti berikut: builder.toString()

@Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}
Jadi kaedah

mencipta objek String, jadi sekarang kami telah mencipta builder.toString().两个对象

Kemudian baris kelima

sudah pasti mencipta objek StringBuffer d = new StringBuffer("abc"), jadi kami mempunyai StringBuffer satu perkara yang perlu diperhatikan ialah 三个对象 tidak memanggil kaedah StringBuffer d oleh itu, tidak Rentetan berlebihan akan dibuat.toString


Ringkasan:

  • "a": pemalar rentetan, tidak dikira sebagai objek yang dicipta

  • "b": Pemalar rentetan, tidak dikira sebagai objek yang dicipta

  • objek pembina: Dicipta semasa melaksanakan

    .a = a+b

  • "ab": Dibuat oleh

    .StringBuilder.toString()

  • "abc": pemalar rentetan, tidak dikira sebagai objek yang dicipta

  • "567": Pemalar rentetan, tidak dikira sebagai objek yang dicipta

  • d: Dibuat oleh

    .new StringBuffer("abc")

Jadi akhirnya tiga objek dicipta.

阿神

Terima kasih atas jawapan anda, saya mungkin memahaminya, saya tidak dapat memahami kod yang dinyahkompilasi sekarang

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan