Tugasan Enigmatic dalam Foreach Gelung: Mengapa Ia Tidak Mempengaruhi Data Dasar
Pertimbangkan coretan kod yang membingungkan di bawah:
String boss = "boss"; char[] array = boss.toCharArray(); for(char c : array) { if (c== 'o') c = 'a'; } System.out.println(new String(array)); //Why does this print "boss" and not "bass"?
Walaupun terdapat penugasan kepada pembolehubah lelaran c, output kekal "bos" dan bukannya "bass" yang dijangkakan. Untuk merungkai misteri ini, kami menyelidiki nuansa gelung foreach.
Pembolehubah Lelaran: Proksi Semata-mata
Apabila mengulang koleksi menggunakan gelung foreach, pembolehubah lelaran (dalam kes ini, c) hanya mewakili salinan elemen. Pada asasnya, ia bertindak sebagai pemegang tempat sementara semasa mengakses koleksi asas.
Mengubah suai Pemegang Tempat lwn. Menukar Koleksi
Tugasan yang dibuat kepada pembolehubah lelaran hanya mempengaruhi salinan dan bukan koleksi asal. Ini bersamaan dengan:
for (int i = 0; i < array.length; i++) { char c = array[i]; if (c == 'o') { c = 'a'; } }
Walaupun nilai c diubah suai setempat, tatasusunan asal kekal tidak berubah.
Pengubahsuaian Penting untuk Perubahan Sebenar
Untuk mengubah suai koleksi asas, akses terus kepada elemen tatasusunan adalah perlu:
for (int i = 0; i < array.length; i++) { if (array[i] == 'o') { array[i] = 'a'; } }
Kod ini secara eksplisit mengubah elemen individu tatasusunan, menghasilkan output "bass" yang dikehendaki.
Kesimpulan
Memahami sifat sebenar pembolehubah lelaran dalam setiap gelung adalah penting untuk mengelakkan kekeliruan dan memastikan manipulasi data yang berkesan. Dengan membuat penetapan kepada elemen tatasusunan dan bukannya pembolehubah lelaran, pembangun boleh mengubah suai koleksi asas dengan yakin mengikut keperluan yang dimaksudkan.
Atas ialah kandungan terperinci Mengapa Pengubahsuaian Pembolehubah Lelaran Gelung Foreach Tidak Mengubah Tatasusunan Pendasar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!