1. Metode untuk memeriksa apakah array berisi nilai tertentu
Gunakan daftar
Public Static Boolean Uselist (String [] arr, String targetValue) {return arrays.aslist (arr) .contains (targetValue);}Menggunakan set
public static boolean menggunakan (string [] arr, string targetValue) {set <string> set = new Hashset <string> (arrays.aslist (arr)); return set.contains (targetValue);}Gunakan penilaian loop
Public static boolean useloop (string [] arr, string targetValue) {for (string s: arr) {if (s.equals (targetValue)) return true; } return false;}Gunakan arrays.binarysearch ()
Metode Arrays.binarySearch() hanya dapat digunakan untuk array yang dipesan! Lai Lai Jika array tidak berurutan, hasilnya akan sangat aneh.
Penggunaan menemukan apakah array yang dipesan berisi nilai tertentu adalah sebagai berikut:
public static boolean usearraysbinarySearch (string [] arr, string targetValue) {int a = arrays.binarysearch (arr, targetValue); if (a> 0) return true; lain mengembalikan false;}Kompleksitas waktu
Kode berikut dapat secara kasar menarik biaya waktu dari berbagai metode. Ide dasarnya adalah menemukan nilai tertentu dari array, dan ukuran array masing -masing adalah 5, 1k, dan 10k. Hasil yang diperoleh dengan metode ini mungkin tidak akurat, tetapi merupakan cara paling sederhana dan paling jelas.
public static void main (string [] args) {string [] arr = new string [] {"cd", "bc", "ef", "de", "ab"}; // Gunakan daftar Long Starttime = System.nanoTime (); untuk (int i = 0; i <100000; i ++) {Uselist (arr, "a"); } Long endtime = System.nanoTime (); durasi panjang = waktu akhir - startTime; System.out.println ("Uselist:" + Durasi / 1000000); // gunakan set startTime = system.nanoTime (); untuk (int i = 0; i <100000; i ++) {useet (arr, "a"); } endtime = System.nanoTime (); durasi = endTime - startTime; System.out.println ("Penggunaan:" + Durasi / 1000000); // gunakan loop startTime = system.nanoTime (); untuk (int i = 0; i <100000; i ++) {useloop (arr, "a"); } endtime = System.nanoTime (); durasi = endTime - startTime; System.out.println ("Useloop:" + Durasi / 1000000); // gunakan arrays.binarysearch () startTime = system.nanoTime (); untuk (int i = 0; i <100000; i ++) {USeArraySbinarySearch (arr, "a"); } endtime = System.nanoTime (); durasi = endTime - startTime; System.out.println ("UseArrayBinary:" + Durasi / 1000000);}Hasil Menjalankan:
Uselist: 13Useset: 72Useloop: 5UseArraySbinarySearch: 9
Gunakan array dengan panjang 1k
String [] arr = string baru [1000]; acak s = random baru (); untuk (int i = 0; i <1000; i ++) {arr [i] = string.valueof (s.nextInt ());}hasil:
Uselist: 112Uset: 2055Useloop: 99UseArrayBinary: 12
Gunakan array dengan panjang 10k
String [] arr = string baru [10000]; acak s = random baru (); untuk (int i = 0; i <10000; i ++) {arr [i] = string.valueof (s.nextInt ());}hasil:
Uselist: 1590useset: 23819Useloop: 1526UseArrayBinary: 12
ringkasan
Jelas, menggunakan metode loop sederhana lebih efisien daripada menggunakan koleksi apa pun. Banyak pengembang menggunakan metode pertama untuk kenyamanan, tetapi efisiensinya juga relatif rendah. Karena Anda menekan array ke dalam jenis koleksi, Anda harus terlebih dahulu melintasi elemen array dan kemudian menggunakan kelas pengumpulan untuk melakukan operasi lain.
Jika Anda menggunakan metode Arrays.binarySearch() , array harus diurutkan. Karena array di atas tidak diurutkan, metode ini tidak tersedia.
Bahkan, jika Anda perlu menggunakan kelas array atau koleksi untuk secara efisien memeriksa apakah array berisi nilai tertentu, daftar atau pohon yang diurutkan dapat mencapai kompleksitas waktu O (log (n)), dan hashset dapat mencapai O (1).
Menggunakan arrayutils
Selain hal -hal di atas, Perpustakaan Kelas Apache Commons juga menyediakan kelas Arrayutils, yang dapat menggunakan metode berisi untuk menilai hubungan antara array dan nilai.
impor org.apache.commons.lang3.arrayutils; public static boolean usearrayutils (string [] arr, string targetValue) {return arrayutils.contains (arr, targetValue);}Tes yang sama dilakukan dengan menggunakan array dari panjang di atas, dan hasilnya adalah bahwa efisiensi metode ini adalah antara menggunakan set dan menggunakan penilaian loop (kadang -kadang hasilnya bahkan lebih ideal daripada menggunakan loop).
Uselist: 323Useset: 3028Useloop: 141UseArrayBinary: 12UseArrayutils: 181 ---------- Uselist: 3703USETET: 35183Useloop: 3218UseArrayBinary: 14UseArrayutils: 3125
Faktanya, jika Anda melihat kode sumber Arrayutils.
Beberapa kode adalah sebagai berikut:
if (array == null) {return -1; } else {if (startIndex <0) {startIndex = 0; } int i; if (objectToFind == null) {for (i = startIndex; i <array.length; ++ i) {if (array [i] == null) {return i; }}} lain if (array.getClass (). getComponentType (). isInstance (objecttofind)) {for (i = startIndex; i <array.length; ++ i) {if (objecttofind.equals (array [i])) {return i; }}} return -1; }Jadi, sebagai perbandingan, saya lebih suka menggunakan kelas alat Arrayutils untuk melakukan beberapa operasi yang terkait dengan nenek moyang gabungan. Lagi pula, dia dapat membiarkan saya menulis banyak kode lebih sedikit (karena pasti ada bug ketika menulis kode sendiri. Lagi pula, perpustakaan alat open source yang disediakan oleh Apache telah diuji oleh pengembang yang tak terhitung jumlahnya), dan efisiensinya tidak jauh lebih rendah.
Meringkaskan
Oke, di atas adalah semua tentang artikel ini. Saya berharap konten artikel ini akan membantu semua orang belajar atau menggunakan Java. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.