Koleksi Java, juga dikenali sebagai bekas, kebanyakannya terdiri daripada Diperoleh daripada dua antara muka utama (Antaramuka): 两大接口 (Interface) 派生出来的: Collection 和 MapKoleksi dan Peta
Seperti namanya, bekas digunakan untuk menyimpan data.
Maka perbezaan antara dua antara muka ini ialah:
Koleksi menyimpan satu elemen;
Peta menyimpan pasangan nilai kunci.
Iaitu, bujang diletakkan dalam Koleksi, dan pasangan diletakkan dalam Peta. (Jadi, di manakah anda berada?
Mempelajari rangka kerja koleksi ini, saya rasa terdapat 4 matlamat:
Kosongkan surat-menyurat antara setiap antara muka dan kelas;
Biasakan diri dengan API yang biasa digunakan untuk setiap antara muka dan kelas;
Dapat memilih struktur data yang sesuai dan menganalisis kelebihan dan kekurangan untuk senario yang berbeza
Mempelajari reka bentuk kod sumber dan dapat menjawab temu bual
, artikel sebelumnya di HashMap telah membincangkannya dengan sangat teliti dan terperinci, jadi saya tidak akan membincangkan butiran dalam artikel ini Jika anda belum membaca artikel itu lagi, sila pergi ke akaun rasmi dan balas "
HashMap. " untuk membaca artikel~
Koleksi
Mari kita lihat Koleksi peringkat teratas dahulu.
Koleksi juga mentakrifkan banyak kaedah, yang juga diwarisi ke dalam pelbagai sub-antara muka dan kelas pelaksanaan Penggunaan API ini juga merupakan ujian biasa dalam kerja harian dan temu duga, jadi mari kita lihat kaedah ini terlebih dahulu.
Set operasi tidak lebih daripada empat kategori "Tambah, Padam, Ubah Suai dan Semak", juga dipanggil CRUD:
Buat, Baca, Kemas Kini dan Padam.
Kemudian saya juga membahagikan API ini kepada ini empat kategori:
Fungsi
kaedah
add
add()/addAll()
()
berubah
Tidak tersedia dalam Antara Muka Koleksi
Semak
mengandungi()/mengandungiSemua()
Lain-lain🎜🎜isKosong()/size()/toArray()🎜🎜🎜
Lihat secara terperinci di bawah:
Ditambah:
boolean add(E e);
Salin selepas log masuk
add() Jenis data yang dihantar mestilah Object, jadi apabila menulis jenis data asas, auto-boxing dan automatik unpacking akan dilakukan Box unboxing. add() 方法传入的数据类型必须是 Object,所以当写入基本数据类型的时候,会做自动装箱 auto-boxing 和自动拆箱 unboxing。
还有另外一个方法 addAll(),可以把另一个集合里的元素加到此集合中。
boolean addAll(Collection<? extends E> c);
Salin selepas log masuk
删:
boolean remove(Object o);
Salin selepas log masuk
remove()是删除的指定元素。
那和 addAll() 对应的, 自然就有removeAll()
Terdapat kaedah lainaddAll(), anda boleh menambah elemen daripada koleksi lain pada koleksi ini.
boolean removeAll(Collection<?> c);
Salin selepas log masuk
Padam:
boolean contains(Object o);
Salin selepas log masuk
Salin selepas log masuk
remove() ialah elemen tertentu yang dipadamkan. 🎜🎜NaheaddAll ( ) Selaras dengan itu, secara semula jadi terdapat removeAll() adalah untuk memadam semua elemen dalam set B. 🎜
boolean containsAll(Collection<?> c);
Salin selepas log masuk
Salin selepas log masuk
🎜🎜🎜Tukar: 🎜🎜🎜🎜Tiada operasi langsung untuk menukar elemen dalam Antara Muka Koleksi Bagaimanapun, pemadaman dan penambahan boleh melengkapkan perubahan! 🎜
查:
查下集合中有没有某个特定的元素:
boolean contains(Object o);
Salin selepas log masuk
Salin selepas log masuk
查集合 A 是否包含了集合 B:
boolean containsAll(Collection<?> c);
Salin selepas log masuk
Salin selepas log masuk
还有一些对集合整体的操作:
判断集合是否为空:
boolean isEmpty();
Salin selepas log masuk
集合的大小:
int size();
Salin selepas log masuk
把集合转成数组:
Object[] toArray();
Salin selepas log masuk
以上就是 Collection 中常用的 API 了。
在接口里都定义好了,子类不要也得要。
当然子类也会做一些自己的实现,这样就有了不同的数据结构。
那我们一个个来看。
List
List 最大的特点就是:有序,可重复。
看官网说的:
An ordered collection (also known as a sequence).
Unlike sets, lists typically allow duplicate elements.
Kali ini saya sebutkan pula ciri-ciri Set Berlawanan sama sekali dengan Set ialah 无序,不重复.
Senarai boleh dilaksanakan dalam dua cara: LinkedList dan ArrayList Soalan yang paling biasa ditanya semasa temu duga ialah cara memilih antara dua struktur data ini.
Untuk masalah pemilihan jenis ini: Pertama ialah mempertimbangkan sama ada struktur data boleh melengkapkan fungsi yang diperlukan Jika kedua-duanya boleh diselesaikan, yang kedua ialah mempertimbangkan yang lebih cekap.
(Semuanya seperti ini.
Mari lihat secara khusus pada API kedua-dua kelas ini dan kerumitan masanya:
Fungsi
Kaedah
ArrayList
LinkedList
add(E e)
O(1)
O(1)
O(1)
O(1)
meningkatkan
tambah(int index, E e)
O(n)
O(n)
delete
move(int index)
O(n)
O(n)
erem
O(n)
O(n)
ubah
set(int index, E e)
O(1)
O(n)
indeks
)
O(1)
O(n)
Sedikit penjelasan:
add(E e) menambah elemen pada ekor. Walaupun ArrayList mungkin berkembang, kerumitan masa terlunas masih O(1). add(E e) 是在尾巴上加元素,虽然 ArrayList 可能会有扩容的情况出现,但是均摊复杂度(amortized time complexity)还是 O(1) 的。
add(int index, E e)是在特定的位置上加元素,LinkedList 需要先找到这个位置,再加上这个元素,虽然单纯的「加」这个动作是 O(1) 的,但是要找到这个位置还是 O(n) 的。(这个有的人就认为是 O(1),和面试官解释清楚就行了,拒绝扛精。
add(int index, E e) ialah untuk menambah elemen pada kedudukan tertentu LinkedList perlu mencari kedudukan ini dahulu, dan kemudian menambah elemen ini Walaupun tindakan "tambah" yang mudah ialah O(1), ia perlu mencari ini Kedudukan masih O(n). (Sesetengah orang menganggap ini O(1). Hanya terangkan dengan jelas kepada penemuduga dan enggan mengambil tanggungjawab.
remove(int index) adalah untuk mengalih keluar elemen pada indeks ini, jadi
ArrayList mencari elemen ini Ia ialah O(1), tetapi selepas dialih keluar, elemen berikutnya mesti dialihkan ke hadapan dengan satu kedudukan, jadi kerumitan terlunas ialah O(n); ) , jadi keseluruhannya juga O(n)
remove(E e) ialah elemen pertama yang dilihat oleh remove, kemudian
ArrayList mesti mencari elemen ini dahulu. Proses ini ialah O(n), dan kemudian alih Selepas pembahagian, anda perlu bergerak satu kedudukan ke hadapan, iaitu O(n), dan jumlahnya masih O(n); dialih keluar, proses ini Ia adalah O(1), dan jumlahnya ialah O(n).
Apakah sebab perbezaan kerumitan masa Jawapan:
Sebab ArrayList dilaksanakan? dengan tatasusunan .
Ciri ini memungkinkan untuk mendapatkan nombor di mana-mana kedudukan dalam tatasusunan dalam masa O(1) melalui langganan, tetapi ini tidak boleh dilakukan dengan senarai terpaut, dan ia hanya boleh dilalui satu demi satu daripada permulaan. Maksudnya, dari segi dua fungsi "pengubahsuaian dan carian", kerana tatasusunan boleh diakses secara rawak, ArrayList sangat cekap.
Bagaimana pula dengan "penambahan dan pemadaman"?
Jika masa untuk mencari elemen ini tidak dipertimbangkan,
Disebabkan kesinambungan fizikal tatasusunan, apabila menambah atau memadam elemen, ia adalah baik di bahagian ekor, tetapi tempat lain akan menyebabkan elemen seterusnya dipindahkan, jadi kecekapan adalah lebih rendah; dan Senarai terpaut boleh dengan mudah memutuskan sambungan daripada elemen seterusnya, terus memasukkan elemen baharu atau mengalih keluar elemen lama.
Tetapi, sebenarnya, anda perlu mengambil kira masa untuk mencari elemen. . . Dan jika ia dikendalikan pada ekor, ArrayList akan menjadi lebih pantas apabila jumlah data adalah besar.
Jadi:
Tukar dan pilih ArrayList;
Tambah dan padam ArrayList yang dipilih di akhir
; ini adalah sama, adalah disyorkan untuk memilih ArrayList Kerana overhed adalah lebih kecil, atau penggunaan memori adalah lebih cekap.
VektorSebagai titik pengetahuan terakhir tentang Senarai, mari bercakap tentang Vektor. Ini juga merupakan siaran yang mendedahkan usia, digunakan oleh semua orang besar.
Kemudian Vektor, seperti ArrayList, juga mewarisi daripada java.util.AbstractList
, dan lapisan bawah juga dilaksanakan menggunakan tatasusunan.
Tetapi ia telah ditamatkan sekarang kerana...ia menambahkan terlalu banyak segerak!
Setiap faedah datang pada harga Kos keselamatan benang adalah kecekapan yang rendah, yang boleh menjadi halangan dalam sesetengah sistem Jadi sekarang kami tidak lagi menyegerakkan pada tahap struktur data, tetapi memindahkan tugas ini ke program kami ==
Jadi soalan temu bual biasa: Apakah perbezaan antara Vector dan ArrayList hanya menjawab ini tidak begitu komprehensif.
Mari kita lihat jawapan undian tinggi pada limpahan timbunan:
Yang pertama ialah isu keselamatan benang yang baru disebut;
Anda perlu melihat kod sumber untuk ini:
ini adalah untuk mengalihkan nombor perduaan bit nombor satu ini ke kanan, dan. paling kiri
melengkapkan bit tanda, tetapi kerana Tiada nombor negatif dalam kapasiti, jadi kami masih menambah 0.Kesan peralihan satu kedudukan ke kanan ialah membahagi dengan 2, maka kapasiti baru yang ditakrifkan ialah 1.5 kali ganda
daripada kapasiti asal.
Mari kita lihat Vektor sekali lagi:
Oleh kerana lazimnya capacityIncrement tidak ditentukan oleh kami, jadi secara lalai ia diperluas dua kali.
Jika anda menjawab dua perkara ini, anda pasti akan baik-baik saja.
Baris & Deque
Barisan ialah struktur data linear yang masuk pada satu hujung dan keluar pada hujung yang lain; .
Kaedah Queue
laman web rasmi[1] telah diringkaskan Ia mempunyai dua set API dan fungsi asasnya adalah sama, tetapi:
Satu kumpulan akan membuang pengecualian;
Kumpulan yang lain akan mengembalikan nilai istimewa. . padam
buang()
poll()
Lihat
elemen()
peek()
Mengapa ia membuang pengecualian?
Sebagai contoh, jika baris gilir kosong, maka remove() akan membuang pengecualian, tetapi poll() akan mengembalikan null() akan membuang pengecualian, dan peek() hanya akan mengembalikan null.
Bagaimana mungkin add(e) membuang pengecualian?
Sesetengah Baris mempunyai had kapasiti, seperti BlockingQueue Jika ia telah mencapai kapasiti maksimumnya dan tidak akan dikembangkan, pengecualian akan dilemparkan; macam mana nak pilih? :
Pertama sekali, jika anda ingin menggunakannya, gunakan
set API yang sama, dan bahagian depan dan belakang harus bersatu
kedua, mengikut keperluan. Jika anda memerlukannya untuk membuang pengecualian, gunakan satu yang membuang pengecualian tetapi pada dasarnya ia tidak digunakan semasa melakukan masalah algoritma, jadi pilih sahaja yang mengembalikan nilai istimewa.
deque
deque boleh dimasukkan dan keluar dari kedua -dua hujungnya. pengecualian dan kumpulan yang lain Mengembalikan nilai istimewa:
fungsi
membuang pengecualian
nilai pulangan
add
add
add
offer/First(e)/First(e) Terakhir (e)
Delete
removeFirst()/ removeLast()
pollFirst()/ pollLast()
Look
First()/getLast ekLast()
Begitu juga apabila menggunakannya Jika anda ingin menggunakannya, gunakan kumpulan yang sama.
API Baris Gilir dan Deque ini mempunyai kerumitan masa O(1). . capai;
Jika anda ingin melaksanakan semantik "gilir keutamaan", gunakan PriorityQueue
Jika anda ingin melaksanakan semantik "stack", gunakan ArrayDeque.
Jom tengok satu persatu. Apabila melaksanakan baris gilir biasa,
Bagaimana untuk memilih antara LinkedList atau ArrayDeque?
Mari kita lihat jawapan undian tinggi pada
StackOverflow
[2]:
Ringkasnya, adalah disyorkan untuk menggunakan ArrayDeque kerana kecekapan tambahan tinggi LinkedL yang lain akan mempunyai kelebihan yang tinggi, manakala (overhead).
Apakah perbezaan antara ArrayDeque dan LinkedList? . tetapi LinkedList boleh;
ArrayDeque lebih cekap apabila mengendalikan operasi penambahan dan pemadaman pada permulaan dan penghujung, tetapi LinkedList hanya mengalih keluar elemen di tengah apabila ia akan dialih keluar dan elemen itu telah ditemui O( 1);
ArrayDeque lebih cekap dari segi penggunaan memori.
Kemudian jika penemuduga yang sangat senior bertanya kepada anda, dalam keadaan apakah anda harus memilih untuk menggunakan LinkedList?
Nilai diletakkan pada kekunci dalam peta, dan PRESENT diletakkan pada nilai Ia adalah Objek statik, bersamaan dengan pemegang tempat, dan setiap kunci menunjukkan objek ini. . , di sini saya tidak akan pergi ke butiran. Rakan-rakan yang belum membacanya boleh membalas “HashMap” di latar belakang akaun rasmi untuk mendapatkan artikel~
Ringkasan
kembali kepada gambar pada permulaan, adakah ia jelas? Sebenarnya terdapat banyak kandungan di bawah setiap struktur data, seperti PriorityQueue Artikel ini tidak menerangkan secara terperinci, kerana lelaki ini akan mengambil masa yang lama untuk membincangkannya. . Jika anda rasa artikel itu bagus, seperti di penghujung artikel itu kembali lagi, Ingat untuk memberi saya "like" dan "membaca"~
Tetapi sekarang saya telah menemui pentadbir profesional untuk menguruskannya bersama saya, jadi "Pangkalan Rahsia Adik Qi" sedang dalam persediaan, dan saya akan menjemput beberapa nama besar di dalam dan luar negara untuk menyertainya bagi membawakan anda perspektif yang berbeza . Fasa pertama pertukaran kumpulan dirancang untuk dibuka pada pertengahan hingga awal bulan Julai saya akan menghantar jemputan dalam kalangan rakan-rakan kemudian, jadi tunggu!
Atas ialah kandungan terperinci Cukuplah untuk membaca artikel ini tentang rangka kerja koleksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn