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
}
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.
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
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:
Biar saya beritahu anda jawapan saya dahulu: Saya rasa ia adalah 3.
Pertama sekali, mari kita jelaskan maksud khusus
Mengikut takrifan di atas, maka terdapat: "a", "b", "abc", "567" semuanya pemalar, diletakkan dalam kolam pemalar, jadi ia tidak dicipta sebagai objek.创建对象
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 sepertiString b = new String("abc")
, maka ia boleh dianggap bahawa objek rentetan dicipta dan dikaitkan dengan pembolehubahb
Kod sumber:
Untuk kemudahan, saya menomborkan setiap baris secara manual.Mari kita lihat kod bait yang sepadan:
Seperti yang dapat dilihat daripada kod bait, baris keempat kod sumberditerjemahkan ke dalam kod berikut:
Kemudian objek baharua = a+b
dicipta di sini, dan kemudian kaedah
Jadi kaedahnew StringBuilder()
dipanggil kod sumbernya adalah seperti berikut:builder.toString()
mencipta objek String, jadi sekarang kami telah mencipta
Kemudian baris kelimabuilder.toString()
.两个对象
sudah pasti mencipta objek
StringBuffer d = new StringBuffer("abc")
, jadi kami mempunyaiStringBuffer
satu perkara yang perlu diperhatikan ialah三个对象
tidak memanggil kaedahStringBuffer d
oleh itu, tidak Rentetan berlebihan akan dibuat.toString
Ringkasan:
.
a = a+b
.
StringBuilder.toString()
.
new StringBuffer("abc")
Terima kasih atas jawapan anda, saya mungkin memahaminya, saya tidak dapat memahami kod yang dinyahkompilasi sekarang