Di sini a dan "abc" ialah dua objek Apabila kaedah pelatih dipanggil, kumpulan pemalar aksara sudah mengandungi rentetan yang sama dengan objek ini, jadi panggilan kaedah pelatih tidak berguna, walaupun ia diikuti oleh b=" abc", b dan a bukan objek yang sama.
Jika anda mahu outputnya sama, sama ada ayat pertama menjadi:
Perkara pertama yang perlu diketahui ialah operasi == menentukan sama ada dua objek atau jenis asas a dan b menghala ke kawasan memori yang sama
Pelaksanaan asas
String ialah nilai akhir peribadi[] Apabila String diwujudkan, ia sebenarnya membahagikan memori berterusan untuk menyimpan tatasusunan aksara melalui System.arraycopy.
new String("abc") sebenarnya tidak disyorkan untuk memulakan String dengan cara ini Pelaksanaan sebenar memerlukan satu langkah lagi daripada a = "abc".
Bahagikan ruang memori dan buat suhu tatasusunan sementara
temp[0] = 'a';temp[1] = 'b';temp[2] = 'c';
Buat nilai tatasusunan dan halakan ruang memori yang ditunjuk mengikut nilai ke ruang memori yang ditunjuk oleh temp, iaitu &value = &temp (jika a = "abc" digunakan, langkah ini tidak diperlukan)
Kaedah pelatih ialah kaedah yang disediakan oleh jdk1.5 dan digunakan untuk pengoptimuman memori String yang sama merujuk kepada ruang memori yang sama, yang sebenarnya merupakan langkah ketiga di atas. Jika a dan b adalah sama di sini, ia boleh ditulis sebagai
String a = "abc";
String b = "abc".intern(); 或者String b = a.intern();
Operasi sebenar adalah langkah ketiga di atas, iaitu, b = a;
Pelaksanaan asas sebenar
String b = "abc" ialah:
Bahagikan ruang memori dan cipta nilai tatasusunan
Dalam langkah kedua, nilai[0] dalam String a dalam nilai[0] dalam String b sebenarnya menunjuk ke alamat memori yang sama, jadi sebenarnya b.value[0] = a.value[0 ] = 'a ', tetapi b.value tidak sama dengan a.value Sebab asasnya ialah kawasan memori yang ditunjuk adalah berbeza
Adalah disyorkan untuk melihat analisis kod sumber String
[Analisis kod sumber JAVA - Java.lang] Analisis kod sumber rentetan
Anda memanggil kaedah
a.intern()
, tetapi anda tidak menetapkan semula hasil pulangana
masiha
yang asal.Gunakan
equals()
untuk menilai kesamaan rentetan Soalan ini malah gagal dalam Java!a.intern(); tidak akan mengubah rujukan aksara, ia mempunyai nilai pulangan.
Yang berikut akan sama
Di sini a dan "abc" ialah dua objek Apabila kaedah pelatih dipanggil, kumpulan pemalar aksara sudah mengandungi rentetan yang sama dengan objek ini, jadi panggilan kaedah pelatih tidak berguna, walaupun ia diikuti oleh b=" abc", b dan a bukan objek yang sama.
Jika anda mahu outputnya sama, sama ada ayat pertama menjadi:
Atau ayat kedua menjadi:
Perkara pertama yang perlu diketahui ialah operasi == menentukan sama ada dua objek atau jenis asas a dan b menghala ke kawasan memori yang sama
Pelaksanaan asasString ialah
nilai akhir peribadi[]
Apabila String diwujudkan, ia sebenarnya membahagikan memori berterusan untuk menyimpan tatasusunan aksara melalui System.arraycopy.
new String("abc") sebenarnya tidak disyorkan untuk memulakan String dengan cara ini Pelaksanaan sebenar memerlukan satu langkah lagi daripada a = "abc".
Pelaksanaan asas sebenar
String b = "abc" ialah:[Analisis kod sumber JAVA - Java.lang] Analisis kod sumber rentetan