您好,登錄后才能下訂單哦!
java中的集合類有哪些?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1、java集合類圖
上述類圖中,實(shí)線邊框的是實(shí)現(xiàn)類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點(diǎn)線邊框的是接口,比如Collection,Iterator,List等。
發(fā)現(xiàn)一個(gè)特點(diǎn),上述所有的集合類,都實(shí)現(xiàn)了Iterator接口,這是一個(gè)用于遍歷集合中元素的接口,主要包含hashNext(),next(),remove()三種方法。
它的一個(gè)子接口LinkedIterator在它的基礎(chǔ)上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說(shuō)如果是先Iterator接口,那么在遍歷集合中元素的時(shí)候,只能往后遍歷,被遍歷后的元素不會(huì)在遍歷到,通常無(wú)序集合實(shí)現(xiàn)的都是這個(gè)接口。
比如HashSet,HashMap;而那些元素有序的集合,實(shí)現(xiàn)的一般都是LinkedIterator接口,實(shí)現(xiàn)這個(gè)接口的集合可以雙向遍歷,既可以通過(guò)next()訪問(wèn)下一個(gè)元素,又可以通過(guò)previous()訪問(wèn)前一個(gè)元素,比如ArrayList。
還有一個(gè)特點(diǎn)就是抽象類的使用。如果要自己實(shí)現(xiàn)一個(gè)集合類,去實(shí)現(xiàn)那些抽象的接口會(huì)非常麻煩,工作量很大。這個(gè)時(shí)候就可以使用抽象類,這些抽象類中給我們提供了許多現(xiàn)成的實(shí)現(xiàn),我們只需要根據(jù)自己的需求重寫一些方法或者添加一些方法就可以實(shí)現(xiàn)自己需要的集合類,工作流大大降低。
2、詳解
2.1HashSet
HashSet是Set接口的一個(gè)子類,主要的特點(diǎn)是:里面不能存放重復(fù)元素,而且采用散列的存儲(chǔ)方法,所以沒(méi)有順序。這里所說(shuō)的沒(méi)有順序是指:元素插入的順序與輸出的順序不一致。
代碼實(shí)例:HashSetDemo
package edu.sjtu.erplab.collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class HashSetDemo { public static void main(String[] args) { Set<String> set=new HashSet<String>(); set.add("a"); set.add("b"); set.add("c"); set.add("c"); set.add("d"); //使用Iterator輸出集合 Iterator<String> iter=set.iterator(); while(iter.hasNext()) { System.out.print(iter.next()+" "); } System.out.println(); //使用For Each輸出結(jié)合 for(String e:set) { System.out.print(e+" "); } System.out.println(); //使用toString輸出集合 System.out.println(set); } }
代碼實(shí)例:SetTest
package edu.sjtu.erplab.collection; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; import java.util.Set; public class SetTest { public static void main(String[] args) throws FileNotFoundException { Set<String> words=new HashSet<String>(); //通過(guò)輸入流代開(kāi)文獻(xiàn) //方法1:這個(gè)方法不需要拋出異常 InputStream inStream=SetTest.class.getResourceAsStream("Alice.txt"); //方法2:這個(gè)方法需要拋出異常 //InputStream inStream = new FileInputStream("D:\\Documents\\workspace\\JAVAStudy\\src\\edu\\sjtu\\erplab\\collection\\Alice.txt"); Scanner in=new Scanner(inStream); while(in.hasNext()) { words.add(in.next()); } Iterator<String> iter=words.iterator(); for(int i=0;i<5;i++) { if(iter.hasNext()) System.out.println(iter.next()); } System.out.println(words.size()); } }
2.2ArrayList
ArrayList是List的子類,它和HashSet想法,允許存放重復(fù)元素,因此有序。集合中元素被訪問(wèn)的順序取決于集合的類型。如果對(duì)ArrayList進(jìn)行訪問(wèn),迭代器將從索引0開(kāi)始,每迭代一次,索引值加1。然而,如果訪問(wèn)HashSet中的元素,每個(gè)元素將會(huì)按照某種隨機(jī)的次序出現(xiàn)。雖然可以確定在迭代過(guò)程中能夠遍歷到集合中的所有元素,但卻無(wú)法預(yù)知元素被訪問(wèn)的次序。
代碼實(shí)例:ArrayListDemo
package edu.sjtu.erplab.collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { List<String> arrList=new ArrayList<String>(); arrList.add("a"); arrList.add("b"); arrList.add("c"); arrList.add("c"); arrList.add("d"); //使用Iterator輸出集合 Iterator<String> iter=arrList.iterator(); while(iter.hasNext()) { System.out.print(iter.next()+" "); } System.out.println(); //使用For Each輸出結(jié)合 for(String e:arrList) { System.out.print(e+" "); } System.out.println(); //使用toString輸出集合 System.out.println(arrList); } }
2.3 ListIterator
ListIterator是一種可以在任何位置進(jìn)行高效地插入和刪除操作的有序序列。
代碼實(shí)例:LinkedListTest
package edu.sjtu.erplab.collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class LinkedListTest { public static void main(String[] args) { List<String> a=new ArrayList<String>(); a.add("a"); a.add("b"); a.add("c"); System.out.println(a); List<String> b=new ArrayList<String>(); b.add("d"); b.add("e"); b.add("f"); b.add("g"); System.out.println(b); //ListIterator在Iterator基礎(chǔ)上添加了add(),previous()和hasPrevious()方法 ListIterator<String> aIter=a.listIterator(); //普通的Iterator只有三個(gè)方法,hasNext(),next()和remove() Iterator<String> bIter=b.iterator(); //b歸并入a當(dāng)中,間隔交叉得插入b中的元素 while(bIter.hasNext()) { if(aIter.hasNext()) aIter.next(); aIter.add(bIter.next()); } System.out.println(a); //在b中每隔兩個(gè)元素刪除一個(gè) bIter=b.iterator(); while(bIter.hasNext()) { bIter.next(); if(bIter.hasNext()) { bIter.next();//remove跟next是成對(duì)出現(xiàn)的,remove總是刪除前序 bIter.remove(); } } System.out.println(b); //刪除a中所有的b中的元素 a.removeAll(b); System.out.println(a); } }
2.4HashMap
HashMap的存取實(shí)現(xiàn)
//存儲(chǔ)時(shí): int hash = key.hashCode();// 這個(gè)hashCode方法這里不詳述,只要理解每個(gè)key的hash是一個(gè)固定的int值 int index = hash % Entry[].length; Entry[index] = value; //取值時(shí): int hash = key.hashCode(); int index = hash % Entry[].length; return Entry[index];
2.5WeekHashMapDemo
package edu.sjtu.erplab.collection; import java.util.WeakHashMap; public class WeekHashMapDemo { public static void main(String[] args) { int size = 100; if (args.length > 0) { size = Integer.parseInt(args[0]); } Key[] keys = new Key[size]; WeakHashMap<Key, Value> whm = new WeakHashMap<Key, Value>(); for (int i = 0; i < size; i++) { Key k = new Key(Integer.toString(i)); Value v = new Value(Integer.toString(i)); if (i % 3 == 0) { keys[i] = k;//強(qiáng)引用 } whm.put(k, v);//所有鍵值放入WeakHashMap中 } System.out.println(whm); System.out.println(whm.size()); System.gc(); try { // 把處理器的時(shí)間讓給垃圾回收器進(jìn)行垃圾回收 Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(whm); System.out.println(whm.size()); } } class Key { String id; public Key(String id) { this.id = id; } public String toString() { return id; } public int hashCode() { return id.hashCode(); } public boolean equals(Object r) { return (r instanceof Key) && id.equals(((Key) r).id); } public void finalize() { System.out.println("Finalizing Key " + id); } } class Value { String id; public Value(String id) { this.id = id; } public String toString() { return id; } public void finalize() { System.out.println("Finalizing Value " + id); } }
比較
看完上述內(nèi)容,你們對(duì)java中的集合類有進(jìn)一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。