集合學習筆記,盜墓筆記歌曲大集合
集合架構總結:
1 Collection介面: 2 Set介面: 3 HashSet//對象必須實現hashCode方法,元素沒有順序呢,效率比LinkedHashSet高 4 LinkedHashSet//是HashSet的擴充,支援規則集內元素的排序,按元素插入集合的順序進行提取 5 TreeSet//保證集合中的元素是有序的,與HashSet相反 6 List介面: 7 ArrayList 8 LinkedList 9 Vector10 Stack//派生於Vector,棧11 Map介面:12 HashMap//效率高13 LinkedHashMap//按照添加順序儲存,可以按添加順序取出14 TreeMap排序性
1 Collection介面
1 這個介面是處理對象集合的根介面。它實現了幾種方法:2 add();3 size();4 iterator();5 Iterator介面:6 next();7 hasNext();8 remove();
2 Set介面
2.1 HashSet具體類(散列集) 散列集是沒有重複元素的元素集合。散列表用鏈表數組實現,每個列表稱為桶。可以用add方法添加元素。contains方法用來快速查看是否某個元素已經出現在集中,只在桶內尋找元素,不必查看集合中所有元素。 散列表迭代器將依次訪問所有的桶。由於散列將元素分散在表的各個位置,所以訪問順序是隨機的。只有不關心集合中的元素順序時才應該使用HashSet。
HashSetTest.java 1 package General; 2 import java.util.*; 3 import java.io.*; 4 public class hashSetTest{ 5 public static void main(String[] args) throws FileNotFoundException{ 6 Set<String> words=new HashSet<String>(); 7 //方法1:這個方法不需要拋出異常 8 //InputStream inStream=SetTest.class.getResourceAsStream("C:/Users/Maria/Desktop/檔案/SDN.txt"); 9 //方法2:這個方法需要拋出異常10 InputStream inStream = new FileInputStream("C:/Users/Maria/Desktop/檔案/SDN.txt");11 Scanner in=new Scanner(inStream);12 while(in.hasNext())13 words.add(in.next()); 14 Iterator<String> iter2=words.iterator();15 for(int i=0;i<words.size()&&iter2.hasNext();i++)16 System.out.print(iter2.next()+" "); 17 System.out.println();18 System.out.println(words.size());19 System.out.println(words);//使用toString輸出集合20 }21 }HashSetTest.java1 輸出結果為:2 3 tyjk ikkl tyujy tukyukuil wse egrerrtuhtirefdhrtj uyku yukuilopcvg gteg 4 95 [tyjk, ikkl, tyujy, tukyukuil, wse, egrerrtuhtirefdhrtj, uyku, yukuilopcvg, gteg]View Code
2.2 TreeSet具體類(樹集)
與散列集十分類似。樹集是一個有序的集合。可以以任意順序將元素插入到集合中。在對集合進行遍曆時,每個值將自動的按照排序後的順序呈現(這點與散列集相反)。如:
1 SortedSet<String>sorter=new TreeSet<String>();2 sorter.add("Bob");3 sorter.add("Alice");4 sorter.add("Carl");5 for(String s:sorter)6 System.out.println(s+" ");
1 結果為:2 Bob Alice Carl
但是TreeSet如何知道希望元素怎樣排序呢,第一種方法,樹集假定插入的元素實現了Comparable介面。這個介面定義了一個方法。
1 public interface Comparable<T>2 int compareTo(T other);//將這個對象(this)與另一對象(other)進行比較,如果this位於other之前則返回負值;如果兩個對象在排序次序中處於相同位置返回0;如果this位於other之後則返回正值。
第二種方法,通過將比較子Comparator對象傳遞給TreeSet構造器來告訴樹集使用不同的比較方法。
1 public interface Comparable<T>2 int compareTo(T a,T b);
3 List介面
3.1 ArrayList具體類(數組列表)
ArrayList是List的子類,它和HashSet相反,允許存放重複元素,因此有序。集合元素被訪問的順序取決於集合的類型。如果對ArrayList進行訪問,迭代器從索引0開始,每迭代一次索引值加1。然而,如果訪問HashSet中的元素,每個元素會按照隨機次序出現。
ArrayListSetTest.java 1 package General; 2 import java.util.*; 3 import java.io.*; 4 public class ArrayListSetTest{ 5 public static void main(String[] args) throws FileNotFoundException{ 6 Set<String> set=new HashSet<String>(); 7 set.add("a"); 8 set.add("b"); 9 set.add("c");10 set.add("c");11 set.add("d"); 12 Iterator<String> iter1=set.iterator();13 while(iter1.hasNext()) 14 System.out.print(iter1.next()+" "); //使用Iterator輸出集合15 System.out.println();16 for(String e:set)17 System.out.print(e+" "); //使用For Each輸出結合18 System.out.println();19 System.out.println(set);//使用toString輸出集合20 }ArrayListSetTest.java1 輸出結果為:2 a b c d 3 a b c d 4 [a, b, c, d]View Code
3.2 LinkedLis具體類(鏈表) LinkedList是一種可以在任何位置進行高效的插入和刪除操作的有序序列。
LinkedListTest.java 1 package General; 2 import java.util.*; 3 public class LinkedListTest { 4 public static void main(String[] args) { 5 List<String> a=new ArrayList<String>(); 6 a.add("a"); 7 a.add("b"); 8 a.add("c"); 9 System.out.println(a);10 11 List<String> b=new ArrayList<String>();12 b.add("d");13 b.add("e");14 b.add("f");15 b.add("g");16 System.out.println(b);17 18 //ListIterator在Iterator基礎上添加了add(),previous()和hasPrevious()方法19 ListIterator<String> aIter=a.listIterator();20 //普通的Iterator只有三個方法,hasNext(),next()和remove()21 Iterator<String> bIter=b.iterator();22 23 //b歸併入a當中,間隔交叉得插入b中的元素24 while(bIter.hasNext())25 {26 if(aIter.hasNext())27 aIter.next();28 aIter.add(bIter.next());29 }30 System.out.println(a);31 32 //在b中每隔兩個元素刪除一個33 bIter=b.iterator();34 35 while(bIter.hasNext())36 {37 bIter.next();38 if(bIter.hasNext())39 {40 bIter.next();//remove跟next是成對出現的,remove總是刪除前序41 bIter.remove();42 }43 }44 System.out.println(b);45 46 //刪除a中所有的b中的元素47 a.removeAll(b);48 System.out.println(a);49 }50 }LinkedListTest.java1 結果為:2 [a, b, c]3 [d, e, f, g]4 [a, d, b, e, c, f, g]5 [d, f]6 [a, b, e, c, g]View Code
3.3 Vector具體類
Vector: 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。效能也就不能超越Array。所以在可能情況下,我們要多運用Array。另外很重要的一點是Vector"sychrovized" 的,這個是Vector和ArroyList的唯一區別。 它實現了一個類似數組一樣的表,自動增加容量來容納你所需要的元素。使用下表格儲存體和檢索對象就像在一個標準的數組中一樣。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類,當兩個或多個線程同時訪問時,效能也是良好的。
3.4 Stack具體類
這個類是從Vector派生而來,並且增加了方法實現棧操作,一種後進先出的儲存結構。
4 Map介面
4.1 HashMap具體類(散列映射)
這部分,參考另外一篇文章,HashMap實現原理
4.2 LinkedHashMap具體類(連結映射表)
串連散列映射表與散列映射表的區別在於,連結散列映射表將用訪問順序,而不是用插入順序,對映射表條目進行迭代。
各種具體類的比較:
集合類架構圖: