cari

Rumah  >  Soal Jawab  >  teks badan

java - 以下创建了几个对象

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中文网2767 hari yang lalu812

membalas semua(3)saya akan balas

  • 高洛峰

    高洛峰2017-04-18 10:25:06

    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 < 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
    }
    

    balas
    0
  • 迷茫

    迷茫2017-04-18 10:25:06

    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.

    balas
    0
  • 阿神

    阿神2017-04-18 10:25:06

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

    balas
    0
  • Batalbalas