Rumah > Soal Jawab > teks badan
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.
高洛峰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
}
迷茫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
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()
.两个对象
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
.a = a+b
.StringBuilder.toString()
.new StringBuffer("abc")
阿神2017-04-18 10:25:06
Terima kasih atas jawapan anda, saya mungkin memahaminya, saya tidak dapat memahami kod yang dinyahkompilasi sekarang