JavaRush /Blog Java /Random-MS /Coffee break #221. Tiga cara untuk mencari elemen dalam t...

Coffee break #221. Tiga cara untuk mencari elemen dalam tatasusunan Java. Apakah Java Thread Local dan cara menggunakannya

Diterbitkan dalam kumpulan

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. Coffee break #221.  Tiga cara untuk mencari elemen dalam tatasusunan Java.  Apakah Java Thread Local dan cara menggunakannya - 1Mencari 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)

  1. Kami melawati semua elemen tatasusunan, satu elemen pada satu masa.
  2. Selain itu, kami menjejaki keadaan elemen sasaran jika ia wujud dalam tatasusunan.
  3. Sebaik sahaja kami menemui elemen ini, kami menukar status daripada palsu kepada benar .
  4. 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

  1. Kita boleh menggunakan ArrayList yang mengandungi kaedah yang secara lalai mencari elemen sasaran dalam senarai.
  2. Memandangkan kaedah ini disediakan oleh List , kami perlu menukar tatasusunan primitif kami kepada senarai.
  3. 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);
  4. Kami boleh menggunakan Java 8 Stream API untuk menjadikan kod kami berfungsi dan lebih pendek.
  5. Untuk memahami cara API Strim berfungsi dengan strim, kami perlu menukar tatasusunan input kami kepada strim.
  6. Arrays.stream mengambil tatasusunan input dan menukarnya menjadi strim.
  7. Memandangkan kami mempunyai benang, kami boleh menggunakan banyak kaedah yang berguna, salah satunya ialah anyMatch . Ia mengembalikan elemen yang sepadan dengan predikat (id == inputId) .
  8. 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.
  1. 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.
  2. Kita sekali lagi boleh menggunakan kod gaya berfungsi untuk menukar tatasusunan primitif kepada Set .
  3. 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. Coffee break #221.  Tiga cara untuk mencari elemen dalam tatasusunan Java.  Apakah Java Thread Local dan cara menggunakannya - 2Java 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 :
  1. Gunakan Thread Local hanya apabila perlu: ​​hanya untuk data khusus thread. Jika data tidak khusus benang, ia mesti disimpan dengan cara lain.
  2. 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.
  3. 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.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION