Panduan untuk Java LinkedList

1. Pengenalan

LinkedList adalah pelaksanaan senarai dua kali ganda antara muka List dan Deque . Ia melaksanakan semua operasi senarai pilihan dan membenarkan semua elemen (termasuk null ).

2. Ciri-ciri

Di bawah ini anda dapat mengetahui sifat terpenting dari LinkedList :

  • Operasi yang mengindeks ke dalam senarai akan melintasi senarai dari awal atau akhir, mana yang lebih dekat dengan indeks yang ditentukan
  • Ia tidak disegerakkan
  • Its Pelelar dan ListIterator iterators sedang gagal-cepat (yang bermaksud bahawa selepas penciptaan iterator, jika senarai tersebut akan diubah suai, yang ConcurrentModificationException akan dilemparkan)
  • Setiap elemen adalah nod, yang merujuk kepada unsur-unsur yang berikutnya dan sebelumnya
  • Ia mengekalkan susunan kemasukan

Walaupun LinkedList tidak diselaraskan, kami dapat mengambil versi yang diselaraskan dengan memanggil kaedah Collections.synchronizedList , seperti:

List list = Collections.synchronizedList(new LinkedList(...));

3. Perbandingan dengan ArrayList

Walaupun kedua-dua mereka melaksanakan Senarai antara muka, mereka mempunyai semantik yang berbeza - yang pasti akan memberi kesan kepada keputusan yang mana satu untuk digunakan.

3.1. Struktur

An ArrayList adalah struktur data indeks berasaskan disokong oleh Array . Ia memberikan akses rawak ke elemennya dengan prestasi yang sama dengan O (1).

Sebaliknya, LinkedList menyimpan datanya sebagai senarai elemen dan setiap elemen dihubungkan dengan elemen sebelumnya dan seterusnya. Dalam kes ini, operasi mencari item mempunyai masa pelaksanaan sama dengan O (n).

3.2. Operasi

Operasi penyisipan, penambahan dan penyingkiran item lebih cepat dalam LinkedList kerana tidak perlu mengubah ukuran array atau mengemas kini indeks apabila elemen ditambahkan ke beberapa posisi sewenang-wenang di dalam koleksi, hanya rujukan pada elemen sekitarnya yang akan berubah.

3.3. Penggunaan memori

A LinkedList menggunakan memori lebih daripada satu ArrayList kerana setiap nod dalam LinkedList kedai dua rujukan, satu untuk unsur sebelum dan satu untuk elemen yang akan datang, sedangkan ArrayList memegang hanya data dan indeks.

4. Penggunaan

Berikut adalah beberapa contoh kod yang menunjukkan bagaimana anda boleh menggunakan LinkedList :

4.1. Ciptaan

LinkedList linkedList = new LinkedList();

4.2. Menambah Elemen

LinkedList mengimplementasikan senarai dan antara muka Deque , selain kaedah add () dan addAll () standard, anda boleh menemui addFirst () dan addLast () , yang masing-masing menambah elemen pada awal atau akhir.

4.3. Mengeluarkan Elemen

Begitu juga dengan penambahan elemen, pelaksanaan senarai ini menawarkan removeFirst () dan removeLast ().

Juga, ada kaedah mudah untuk menghapusFirstOccurence () dan removeLastOccurence () yang mengembalikan boolean (benar jika koleksi mengandungi elemen yang ditentukan).

4.4. Operasi Beratur

Antara muka Deque memberikan tingkah laku seperti antrian (sebenarnya Deque meluaskan antara muka Antrian ):

linkedList.poll(); linkedList.pop();

Kaedah tersebut mengambil elemen pertama dan mengeluarkannya dari senarai.

Perbezaan antara tinjauan pendapat () dan pop () adalah bahawa pop akan membuang NoSuchElementException () pada senarai kosong, sedangkan tinjauan mengembalikan nol. APIs pollFirst () dan pollLast () juga tersedia.

Berikut adalah contoh bagaimana API push berfungsi:

linkedList.push(Object o);

Yang memasukkan elemen sebagai kepala koleksi.

LinkedList mempunyai banyak kaedah lain, sebahagian besar daripada yang sepatutnya menjadi biasa kepada pengguna yang telah digunakan Senarai . Lain-lain yang disediakan oleh Deque mungkin merupakan alternatif yang mudah untuk kaedah "standard".

Dokumentasi lengkap boleh didapati di sini.

5. Kesimpulan

ArrayList biasanya pelaksanaan Senarai lalai .

Walau bagaimanapun, terdapat kes penggunaan tertentu di mana menggunakan LinkedList akan lebih sesuai, seperti pilihan untuk masa penyisipan / penghapusan berterusan (contohnya, penyisipan / penghapusan / kemas kini yang kerap), masa akses berterusan dan penggunaan memori yang berkesan.

Contoh kod boleh didapati di GitHub.