Ada soalan seperti ini:
Berapa banyak objek yang dicipta oleh String("aaa") baharu? Jawapannya ialah untuk mencipta satu atau dua Sebabnya ialah jika pembolehubah aaa wujud dalam kawasan malar, hanya satu dicipta dalam timbunan; jika pembolehubah aaa tidak wujud dalam kawasan malar, satu dicipta dalam kawasan malar dan satu dalam timbunan.
Tetapi keputusan ujian sebenar saya tidak konsisten:
String s1 = new String("aaa");
String s2 = "aaa";
System.out.println(s1 == s2); //false
Jika String("aaa") baharu mencipta objek dalam kedua-dua timbunan dan kawasan malar, maka mengapa s2 tidak terus menggunakan semula rujukan kepada kumpulan malar s1?
Tambahan:
Saya dapati bahawa saya tersalah sangka s1 harus menunjuk ke elemen dalam timbunan, dan s2 menunjuk ke elemen dalam kolam malar, jadi betul bahawa kedua-duanya tidak sama new String("aaa") juga mencipta objek dalam kolam malar pada masa yang sama?
Atau String s3 = "aa".concat("a"); Adakah s3 ini menghala ke timbunan atau kolam malar Bolehkah ia menggunakan semula pembolehubah dalam kolam malar?
Apabila contoh String memanggil kaedah intern(), ia akan menyemak sama ada terdapat pemalar rentetan yang sama dalam kumpulan pemalar Jika ya, rujukannya akan dikembalikan Jika tidak, rentetan yang sama dengan str akan ditambahkan pada pemalar pool dan Kembalikan rujukannya Memandangkan s2 sudah berada dalam kumpulan malar, s1.intern() tidak akan menciptanya lagi, tetapi secara langsung merujuk "aaa" yang sama.
Jika ini tidak cukup jelas, mari bereksperimen,
Kemudian baris arahan
Perhatikan bahawa kolam berterusan mempunyai VV
Soalan 1:
String a = "aaa" akan mencipta objek dalam kolam malar Jika objek yang sama wujud dalam kolam malar, maka akan menghala terus ke objek. Dan String a = new String("aaa"), jika ia wujud dalam kolam malar, ia tidak akan dicipta dalam kolam malar, tetapi hanya dalam timbunan.
Soalan 2:
Cari jawapan daripada kod sumber String s3 = "aa".concat("a"); sebenarnya bersamaan dengan String s3 = new String("aaa"), yang akan mencipta objek dalam timbunan.
String tidak mencipta contoh objek String baharu setiap kali ia diberikan nilai? Itulah sebabnya terdapat StringBuilder.
Menurut pemikiran berorientasikan objek, String sendiri mungkin lebih mengetahui sama ada untuk mencipta objek dalam kumpulan tetap pada masa yang sama, ia mempunyai kaedah intern().
Jawapan daripada beberapa yang sebelumnya sudah sangat baik Izinkan saya menambah bahawa apa yang sering kita katakan "memasukkan rentetan ke dalam kolam malar" merujuk kepada meletakkan rujukan rentetan ke dalam kolam malar rentetan (String Pool, yang pada asasnya adalah. jadual hash), rentetan itu sendiri masih diletakkan pada timbunan.