Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan kelas koleksi (Koleksi) di Java?

Bagaimana untuk menggunakan kelas koleksi (Koleksi) di Java?

PHPz
PHPzke hadapan
2023-04-23 20:28:05921semak imbas

Antara muka koleksi

Koleksi ialah antara muka koleksi paling asas A Collection mewakili sekumpulan Objek, iaitu elemen Koleksi. Sesetengah Koleksi membenarkan unsur yang sama dan yang lain tidak. Beberapa jenis dan yang lain tidak. JavaSDK tidak menyediakan kelas yang diwarisi secara langsung daripada Koleksi Kelas yang disediakan oleh Java SDK adalah semua "sub-antara muka" yang diwarisi daripada Koleksi, seperti Senarai dan Set.

Semua kelas yang melaksanakan antara muka Koleksi mesti menyediakan dua pembina standard: pembina tanpa parameter digunakan untuk mencipta Koleksi kosong, dan pembina dengan parameter Koleksi digunakan untuk mencipta Koleksi baharu ini mempunyai elemen yang sama seperti Koleksi yang diluluskan. Pembina yang terakhir membenarkan pengguna menyalin Koleksi.

Bagaimana untuk melintasi setiap elemen dalam Koleksi? Tidak kira jenis Koleksi sebenar, ia menyokong kaedah iterator(), yang mengembalikan iterator yang boleh digunakan untuk mengakses setiap elemen dalam Koleksi satu demi satu. Penggunaan biasa adalah seperti berikut:

Iterator it = collection.iterator(); // 获得一个迭代子  while(it.hasNext())   {  Object obj = it.next(); // 得到下一个元素  }

Dua antara muka yang diperoleh daripada antara muka Koleksi ialah Senarai dan Set.

Antara muka senarai

Senarai ialah Koleksi tersusun Gunakan antara muka ini untuk mengawal kedudukan sisipan setiap elemen dengan tepat. Pengguna boleh menggunakan indeks (kedudukan elemen dalam Senarai, serupa dengan subskrip tatasusunan) untuk mengakses elemen dalam Senarai, yang serupa dengan tatasusunan Java.

Tidak seperti Set yang dinyatakan di bawah, Senarai membenarkan elemen yang sama.

Selain kaedah iterator() yang diperlukan untuk antara muka Koleksi, List juga menyediakan kaedah listIterator(), yang mengembalikan antara muka ListIterator Berbanding dengan antara muka Iterator standard, ListIterator mempunyai beberapa lagi add() dan Kaedah yang serupa membenarkan menambah, memadam, menetapkan elemen dan melintasi ke hadapan atau ke belakang.

Kelas biasa yang melaksanakan antara muka Senarai termasuk LinkedList, ArrayList, Vector dan Stack.

Kelas LinkedList

LinkedList melaksanakan antara muka Senarai, membenarkan unsur nol. Selain itu, LinkedList menyediakan kaedah dapatkan, alih keluar dan sisip tambahan di kepala atau ekor LinkedList. Operasi ini membenarkan LinkedList digunakan sebagai tindanan, baris gilir atau deque.

Perhatikan bahawa LinkedList tidak mempunyai kaedah yang disegerakkan. Jika berbilang benang mengakses Senarai pada masa yang sama, mereka mesti melaksanakan penyegerakan akses sendiri. Satu penyelesaian ialah membina Senarai yang disegerakkan apabila mencipta Senarai:

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

kelas ArrayList

ArrayList melaksanakan tatasusunan bersaiz berubah-ubah. Ia membenarkan semua elemen, termasuk null. ArrayList tidak disegerakkan.

saiz, isEmpty, get, set kaedah masa berjalan adalah malar. Walau bagaimanapun, kos kaedah tambah ialah pemalar terlunas, dan menambah n elemen memerlukan masa O(n). Kaedah lain mempunyai masa berjalan linear.

Setiap contoh ArrayList mempunyai kapasiti (Kapasiti), iaitu saiz tatasusunan yang digunakan untuk menyimpan elemen. Kapasiti ini meningkat secara automatik apabila elemen baharu ditambah, tetapi algoritma pertumbuhan tidak ditakrifkan. Apabila sejumlah besar elemen perlu dimasukkan, kaedah ensureCapacity boleh dipanggil untuk meningkatkan kapasiti ArrayList sebelum memasukkan untuk meningkatkan kecekapan sisipan.

Seperti LinkedList, ArrayList juga tidak disegerakkan.

Kelas vektor

Vektor sangat serupa dengan ArrayList, tetapi Vektor disegerakkan. Walaupun Iterator yang dicipta oleh Vector mempunyai antara muka yang sama seperti Iterator yang dicipta oleh ArrayList, kerana Vector disegerakkan, apabila Iterator dicipta dan sedang digunakan, thread lain mengubah keadaan Vektor (contohnya, menambah atau mengalih keluar beberapa elemen) , ConcurrentModificationException akan dilemparkan apabila memanggil kaedah Iterator, jadi pengecualian mesti ditangkap.

Kelas tindanan

Timbunan mewarisi daripada Vektor dan melaksanakan tindanan masuk-dahulu keluar. Stack menyediakan 5 kaedah tambahan yang membolehkan Vektor digunakan sebagai tindanan. Kaedah tolak dan pop asas, serta kaedah mengintip, dapatkan elemen di bahagian atas tindanan, kaedah kosong menguji sama ada tindanan kosong dan kaedah carian mengesan kedudukan unsur dalam tindanan. Tindanan ialah tindanan kosong selepas ia dibuat.

Tetapkan antara muka

Set ialah Koleksi yang tidak mengandungi unsur pendua, iaitu, mana-mana dua elemen e1 dan e2 mempunyai e1.equals(e2)= false, Set mempunyai paling banyak satu elemen nol.

Jelas sekali, pembina Set mempunyai kekangan bahawa parameter Koleksi yang diluluskan tidak boleh mengandungi unsur pendua.

Sila ambil perhatian: Objek boleh ubah mesti dikendalikan dengan berhati-hati. Jika elemen boleh ubah dalam Set mengubah keadaannya menyebabkan Object.equals(Object)=true, ia akan menyebabkan beberapa masalah.

Antara muka Peta

Sila ambil perhatian bahawa Map tidak mewarisi antara muka Koleksi Map menyediakan kunci kepada pemetaan nilai. Peta tidak boleh mengandungi kunci yang sama, dan setiap kunci hanya boleh memetakan satu nilai. Antara muka Peta menyediakan tiga jenis paparan set Kandungan Peta boleh dianggap sebagai set set kunci, set set nilai atau set pemetaan nilai kunci.

Kelas Hashtable

Hashtable mewarisi antara muka Peta dan melaksanakan jadual cincang pemetaan nilai kunci. Sebarang objek bukan nol boleh digunakan sebagai kunci atau nilai.

Untuk menambah data, gunakan put(key, value) dan untuk mengalih keluar data, gunakan get(key) Kos masa bagi kedua-dua operasi asas ini adalah tetap.

Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。

使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:

Hashtable numbers = new Hashtable();  numbers.put(“one”, new Integer(1));  numbers.put(“two”, new Integer(2));  numbers.put(“three”, new Integer(3));

要取出一个数,比如2,用相应的key:

Integer n = (Integer)numbers.get(“two”);  System.out.println(“two = ” + n);

由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。

hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。

如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。

Hashtable是同步的。

HashMap类

HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

WeakHashMap类

WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

Atas ialah kandungan terperinci Bagaimana untuk menggunakan kelas koleksi (Koleksi) di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam