Saya memiliki array a
yang terus diperbarui. Katakan saja a = [1,2,3,4,5]
. Saya perlu membuat salinan duplikat yang tepat a
dan menyebutnya b
. Jika a
ingin berubah [6,7,8,9,10]
, b
harus tetap [1,2,3,4,5]
. Apa cara terbaik untuk melakukan ini? Saya mencoba for
loop seperti:
for(int i=0; i<5; i++) {
b[i]=a[i]
}
tapi itu sepertinya tidak berfungsi dengan benar. Tolong jangan gunakan istilah lanjutan seperti salinan dalam, dll., Karena saya tidak tahu apa artinya itu.
System.arraycopy
, Anda akan melihat bahwa metode ini perlu memeriksa berbagai hal sebelum dimulai. Beberapa pemeriksaan ini tidak perlu dengan loop salinan, tergantung pada jenis array statis.clone()
ternyata menjadi yang tercepat untuk 250.000 elemen.src.clone()
lebih mudah dibaca dan memiliki jauh lebih sedikit kesempatan untuk kesalahan daripada mengalokasikan array baru dan melakukanarraycopy
. (Dan kebetulan juga cepat.)kamu bisa menggunakan
demikian juga.
sumber
Jika Anda ingin membuat salinan:
Inilah cara untuk pergi:
Arrays.copyOf
mungkin lebih cepat daripadaa.clone()
pada array kecil. Kedua elemen salin sama-sama cepat tetapi klon () kembaliObject
sehingga kompiler harus memasukkan cast implisit keint[]
. Anda bisa melihatnya di bytecode, kira-kira seperti ini:sumber
Penjelasan yang bagus dari http://www.journaldev.com/753/how-to-copy-arrays-in-java
Metode Salin Java Array
sumber
Saya merasa bahwa semua ini "cara yang lebih baik untuk menyalin array" tidak benar-benar akan menyelesaikan masalah Anda.
Kamu bilang
Melihat loop itu, tidak ada alasan yang jelas untuk itu tidak berfungsi ... kecuali:
a
danb
array kacau (misalnyaa
danb
merujuk ke array yang sama), ataua
array secara bersamaan.Dalam kedua kasus tersebut, cara-cara alternatif melakukan penyalinan tidak akan menyelesaikan masalah yang mendasarinya.
Perbaikan untuk skenario pertama jelas. Untuk skenario kedua, Anda harus mencari cara untuk menyinkronkan utas. Kelas array atom tidak membantu karena mereka tidak memiliki konstruktor salinan atom atau metode kloning, tetapi sinkronisasi menggunakan mutex primitif akan melakukan triknya.
(Ada petunjuk dalam pertanyaan Anda yang membuat saya berpikir bahwa ini memang terkait utas; mis. Pernyataan Anda yang
a
terus berubah.)sumber
Anda dapat mencoba menggunakan Arrays.copyOf () di Jawa
sumber
Semua solusi yang memanggil panjang dari array, tambahkan kode Anda redundant null checkersconsider misalnya:
Saya sarankan Anda tidak menciptakan roda dan menggunakan kelas utilitas di mana semua pemeriksaan yang diperlukan telah dilakukan. Pertimbangkan ArrayUtils dari apache commons. Kode Anda menjadi lebih pendek:
Apache commons dapat Anda temukan di sana
sumber
Anda juga bisa menggunakan
Arrays.copyOfRange
.Contoh :
Metode ini mirip dengan
Arrays.copyOf
, tetapi lebih fleksibel. Keduanya digunakan diSystem.arraycopy
bawah tenda.Lihat :
sumber
Untuk salinan array yang aman dari nol, Anda juga dapat menggunakan opsional dengan
Object.clone()
metode yang disediakan dalam jawaban ini .sumber
Optional
objek tersebut hanyalah objek kosong dengan referensi ke array yang ada. Tentang dampak kinerja, saya akan mengatakan itu terlalu dini untuk mengatakan itu sebenarnya dampak karena jenis konstruksi ini adalah kandidat yang baik untuk melakukan inferensi di dalam JVM dan kemudian tidak lebih berdampak daripada metode lain. Ini masalah gaya (pemrograman fungsional versus pemrograman prosedural tetapi tidak hanya) untuk menganggapnya lebih rumit atau tidak.Jika Anda harus bekerja dengan array mentah dan tidak
ArrayList
kemudianArrays
memiliki apa yang Anda butuhkan. Jika Anda melihat kode sumbernya, ini adalah cara terbaik untuk mendapatkan salinan array. Mereka memiliki sedikit pemrograman defensif karenaSystem.arraycopy()
metode ini melempar banyak pengecualian yang tidak dicentang jika Anda memberinya parameter tidak logis.Anda dapat menggunakan salah satu
Arrays.copyOf()
yang akan menyalin dariNth
elemen pertama ke array yang lebih pendek baru.atau
Arrays.copyOfRange()
akan melakukan trik:Seperti yang Anda lihat, keduanya hanyalah fungsi pembungkus
System.arraycopy
dengan logika defensif bahwa apa yang Anda coba lakukan valid.System.arraycopy
adalah cara tercepat mutlak untuk menyalin array.sumber
Saya punya masalah yang sama dengan array 2D dan berakhir di sini. Saya menyalin array utama dan mengubah nilai-nilai array internal, dan terkejut ketika nilai-nilai berubah di kedua salinan. Pada dasarnya kedua salinan itu independen tetapi berisi referensi ke array dalam yang sama dan saya harus membuat array salinan array dalam untuk mendapatkan apa yang saya inginkan.
Ini mungkin bukan masalah OP, tapi saya harap itu masih bisa membantu.
sumber