Tiga cara untuk mencari elemen dalam tatasusunan Java
Sumber:
Asyncq Siaran ini akan membantu anda lebih memahami cara yang berbeza untuk mencari elemen dalam tatasusunan dalam Java. Mencari elemen tertentu dalam satu set nilai adalah operasi yang sangat biasa dan kerap digunakan dalam pembangunan perisian. Terdapat pendekatan yang berbeza untuk menyelesaikan masalah ini, daripada mudah kepada dioptimumkan. Mari lihat mereka.
Input data
Tatasusunan input mengandungi data id primitif dan kita perlu tahu sama ada ia mengandungi id->3.
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
int inputId = 3;
Kaedah 1 (mudah)
- Kami melawati semua elemen tatasusunan, satu elemen pada satu masa.
- Selain itu, kami menjejaki keadaan elemen sasaran jika ia wujud dalam tatasusunan.
- Sebaik sahaja kami menemui elemen ini, kami menukar status daripada palsu kepada benar .
- Selepas gelung selesai, kami mengembalikan bendera status.
boolean valExist = false;
for (int id : ids) {
if (inputId == id) {
valExist = true;
}
}
return valExist;
Penyelesaian ini berfungsi, tetapi ia tidak begitu cekap. Jika anda melihat keadaan
if , anda akan menyedari bahawa kami sedang menguji keadaan ini untuk semua elemen. Katakan elemen yang kami cari ialah elemen pertama, tetapi gelung kami masih akan terus berjalan untuk semua elemen. Di sini adalah lebih bijak untuk keluar dari gelung sebaik sahaja kita menemui elemen tersebut. Dengan melakukan ini, kami akan menjimatkan pengiraan apabila elemen yang kami cari tidak berada di kedudukan terakhir.
boolean valExist = false;
for (int id : ids) {
if (inputId == id) {
valExist = true;
break;
}
}
return valExist;
Anda boleh menjadikan kod anda lebih ringkas dengan menggunakan
return . Kami boleh mengembalikan
benar sebaik sahaja kami melihat elemen yang kami cari, jika tidak, kami mengembalikan
palsu sebaik sahaja gelung selesai. Dan kita tidak perlu mencipta dan mengekalkan pembolehubah keadaan.
for (int id : ids) {
if (inputId == id) {
return true;
}
}
return false;
Kaedah 2
- Kita boleh menggunakan ArrayList yang mengandungi kaedah yang secara lalai mencari elemen sasaran dalam senarai.
- Memandangkan kaedah ini disediakan oleh List , kami perlu menukar tatasusunan primitif kami kepada senarai.
- Kita boleh menggunakan rentetan lambda tunggal yang menukar primitif kepada jenis objek dan mencipta senarai daripadanya.
return Arrays.asList(Arrays.stream(ids).boxed().toArray())
.contains(inputId);
- Kami boleh menggunakan Java 8 Stream API untuk menjadikan kod kami berfungsi dan lebih pendek.
- Untuk memahami cara API Strim berfungsi dengan strim, kami perlu menukar tatasusunan input kami kepada strim.
- Arrays.stream mengambil tatasusunan input dan menukarnya menjadi strim.
- Memandangkan kami mempunyai benang, kami boleh menggunakan banyak kaedah yang berguna, salah satunya ialah anyMatch . Ia mengembalikan elemen yang sepadan dengan predikat (id == inputId) .
- Semua ini menjadikan kod kami lebih pendek dan lebih mudah dibaca.
return Arrays.stream(ids)
.anyMatch(id -> id == inputId);
Kaedah 3 (dioptimumkan)
Ya, kod yang ditunjukkan di atas berfungsi dan mudah dibaca, tetapi kami masih perlu melawati dan membandingkan setiap elemen dalam strim.
- Jika ingatan bukan masalah dan kami ingin mengoptimumkan pengiraan, maka salah satu perkara yang boleh kami lakukan di sini ialah mencipta set daripada tatasusunan input.
- Kita sekali lagi boleh menggunakan kod gaya berfungsi untuk menukar tatasusunan primitif kepada Set .
- Sekarang kita mempunyai Set , kita boleh mencari elemen dalam tempoh masa yang tetap.
S
et<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return idsSet.contains(inputId);
Bonus
Mencari satu elemen boleh dianggap sebagai operasi biasa, tetapi lebih biasa ialah mencari berbilang elemen dalam tatasusunan. Dalam kes ini, jika kita tidak menggunakan
Set , kita akan mempunyai dua gelung dan kerumitan masa akan meningkat untuk mendarab panjang dua koleksi. Di bawah ialah contoh di mana kita menukar salah satu tatasusunan sebagai set dan kemudian melelang ke atas tatasusunan yang lain dan melakukan carian dalam operasi set. Dengan melakukan ini, kami meningkatkan ingatan dan pada masa yang sama menjimatkan pengiraan.
int[] targetIds = { 1, 3, 6, 88, 999, 34, 44, 55};
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
Set<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return Arrays.stream(targetIds)
.boxed()
.filter(id -> !idsSet.contains(id))
.mapToInt(a -> a)
.toArray();
Apakah Java Thread Local dan cara menggunakannya
Sumber:
Sederhana Dalam artikel ini, kita akan melihat Java Thread Local dan cara menggunakannya dengan berkesan dalam aplikasi Java anda. Java
Thread Local ialah ciri berkuasa yang membolehkan pembangun mencipta pembolehubah hanya untuk utas tertentu. Ini bermakna setiap utas boleh mempunyai salinan pembolehubahnya sendiri dan perubahan yang dibuat kepada pembolehubah dalam satu utas tidak akan menjejaskan nilainya dalam utas lain.
Apakah itu Thread Local
Thread Local ialah kelas dalam Java API yang membolehkan anda membuat pembolehubah yang setempat kepada thread tertentu. Iaitu, setiap utas mempunyai salinan pembolehubahnya sendiri, dan perubahan yang dibuat kepada pembolehubah dalam satu utas tidak menjejaskan nilainya dalam utas lain. Ini menjadikan
Thread Local penyelesaian yang ideal untuk menyimpan data khusus benang seperti maklumat pengesahan pengguna, sambungan pangkalan data atau sebarang maklumat khusus benang lain.
Bagaimana Thread Tempatan Berfungsi di Java
Untuk menggunakan
Thread Local dalam aplikasi Java anda, anda perlu mencipta contoh kelas
Thread Local . Ini boleh dilakukan dengan memanggil
ThreadLocal constructor , yang akan mencipta contoh baharu kelas ini. Seterusnya, dengan mencipta objek
Thread Local , anda boleh menggunakannya untuk menyimpan dan mendapatkan semula data khusus thread. Berikut ialah contoh cara menggunakan
Thread Local dalam aplikasi Java anda:
public class MyThreadLocalClass {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void set(String value) {
threadLocal.set(value);
}
public static String get() {
return threadLocal.get();
}
}
Dalam contoh ini, kami mencipta objek
Thread Local yang dipanggil
threadLocal jenis
String . Kami juga mencipta dua kaedah:
set() dan
get() yang membolehkan kami menyimpan dan mendapatkan semula nilai pembolehubah
Setempat Thread . Untuk menyimpan nilai dalam pembolehubah
Setempat Thread , kami hanya memanggil kaedah
set() dan menghantar nilai yang ingin kami simpan. Sebagai contoh, kita boleh memanggil
MyThreadLocalClass.set("Hello, World!") untuk menyimpan rentetan
"Hello, World!" dalam pembolehubah
Setempat Thread . Untuk mendapatkan nilai pembolehubah
Setempat Thread , kami hanya memanggil kaedah
get() . Sebagai contoh, kita boleh memanggil
nilai String = MyThreadLocalClass.get() untuk mendapatkan nilai pembolehubah
Setempat Thread .
Pengesyoran untuk bekerja dengan Thread Local
Walaupun
Thread Local boleh menjadi alat yang berkuasa dalam aplikasi Java anda, adalah penting untuk menggunakannya dengan betul untuk mengelakkan masalah yang mungkin berlaku. Berikut ialah beberapa garis panduan yang perlu diingat apabila menggunakan
Thread Local :
- Gunakan Thread Local hanya apabila perlu: hanya untuk data khusus thread. Jika data tidak khusus benang, ia mesti disimpan dengan cara lain.
- Elakkan penggunaan memori yang berlebihan: Thread Local boleh menggunakan sejumlah besar memori jika tidak digunakan dengan berhati-hati. Pastikan untuk mengosongkan pembolehubah Setempat Thread apabila ia tidak lagi diperlukan untuk mengelakkan penggunaan memori yang berlebihan.
- Gunakan Thread Local dengan berhati-hati dalam persekitaran berbilang benang: adalah penting untuk memahami potensi risiko dan had. Pastikan anda menguji kod anda dengan teliti untuk memastikan bahawa Thread Local berfungsi seperti yang diharapkan dalam persekitaran khusus anda.
Kesimpulan
Java
Thread Local ialah alat hebat yang membolehkan pembangun mencipta pembolehubah hanya untuk utas tertentu. Menggunakan
Thread Local , anda boleh menyimpan data khusus thread, seperti maklumat pengesahan pengguna, sambungan pangkalan data atau maklumat khusus thread lain. Walaupun
Thread Local boleh menjadi alat yang berkuasa, adalah penting untuk menggunakannya dengan betul untuk mengelakkan kemungkinan masalah. Dengan mengikuti amalan terbaik dan menguji kod anda, anda boleh menggunakannya dengan berkesan untuk meningkatkan prestasi dan kebolehpercayaan aplikasi Java anda.
GO TO FULL VERSION