1. 程式人生 > >【知了堂學習筆記】java中常用集合的理解

【知了堂學習筆記】java中常用集合的理解

style out hset 篩選 arraylist list 內容 必備 foreach

  最近學習了java中常用集合類的一些知識,在這裏作為一只小白,我來談談我的理解,順帶總結知識點。

引入:在沒有接觸之前,聽到集合,給我感覺是想到了數學中的集合一樣,裏面存放著一個一個的元素。其實不然,這個集合也就差不多,是用來存放元素的容器。


  Java中的集合類包含的內容很多而且很重要,很多數據的存儲和處理(排序,去重,篩選等)都需要通過集合類來完成。

  今天我要談的主要是,如下圖所示:

技術分享圖片

1.Collection

  Collection是最基本的集合類型,若要檢查Collection中的元素,可以使用forEach遍歷,也可以使用叠代器,實現了Collection接口的類,都可以這樣操作。用法如下:

package 集合;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionTest_1 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<String>();
        collection.add("蘋果一");
        collection.add(
"蘋果二"); collection.add("蘋果三"); //第一種方式通過forEach遍歷打印 System.out.println("通過forEach遍歷打印如下:"); for(String str:collection){ System.out.println(str); } System.out.println("-------------------------"); //第二種方式通過iterator遍歷打印 System.out.println("通過iterator叠代器打印如下所示:"); Iterator
<String> it = collection.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }

1.1 List 接口

  List是Collection派生的接口,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引的位置來訪問List中的元素,類似於Java數組。 List允許有相同的元素存在。   除了具有Collection接口必備的的iterator()方法外,還提供了listIterator()方法,放回一個 ListIterator接口。   實現List接口的常用類有LinkedList、ArrayList、Vector和Stack,下面來簡單介紹。

  1.1.1 ArrayList 類

  ArrayList從數據結構上來說,為順序線性結構,用戶若要對數據經常查閱或者是獲取數據時,本類為用戶的最佳選擇類。常用方法:      add();addAll();get();size();set();remove();isEmpty();至於它們的例子,我就不一一舉了,更多的方法可通過Api文檔去查閱。

  1.1.2 LinkedList 類

  LinkedList實現了List類接口,允許null元素。此外LinkedList提供額外的add、get、remove、insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque) LinkedList較ArrayList而言,若用戶對數據經常進行插入或者是是刪除之類的話,那麽用本類為最優選擇。

  1.1.3 Stack 類

  stack翻譯過來為棧,在前面講到堆棧模型的時候,我們就知道了它有先進後出的特點。   Stack繼承自Vector,實現了一個後進先出的堆棧。Stack提供了5個額外的方法使得Vector得以被當做堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空,serach方法檢測一個元素在堆棧中的位置。Stack剛創建後是空棧。 請看下面的代碼,簡單理解Stack的常用方法:
 1 package 集合;
 2 
 3 import java.util.Stack;
 4 
 5 public class StackTest1 {
 6     public static void main(String[] args) {
 7         Stack<Integer> st = new Stack<Integer>();
 8         st.push(1);
 9         st.push(2);
10         st.push(3);
11         st.push(4);
12         st.push(5);
13         
14         System.out.println(st.pop());//5  棧頂的那一個是一個最先出來的
15         System.out.println("棧的長度為:"+st.size());//4 計算移除棧中的尺寸
16         //st.peek();是指要將棧中的某一個元素拿出用,但它仍在棧中,棧中的長度與沒執行這條語句之前是一樣的
17         System.out.println(st.peek());//4
18         int value = st.peek();//4 將要用到集合中的值得時候,就用peek()方法
19         int a =10;
20         int result = value+a;//result=3+10=14
21         System.out.println(result);//13
22         System.out.print("棧的長度為:"+st.size());//4 計算移除棧中的尺寸
23         
24     }
25 }

輸出結果為:

5
棧的長度為:4
4
14
棧的長度為:4

至於結果,代碼中註釋寫的比較清楚了,這裏我就不在說了。

LinkedList可以被用作堆棧、隊列等。舉個例子:

下面是一個LinkedList集合實現堆棧的代碼:

 1 public class LinkedListTest1 {
 2     public static void main(String[] args) {
 3         LinkedStack ls = new LinkedStack();
 4         Apple apple1 = new Apple("蘋果一");
 5         Apple apple2 = new Apple("蘋果二");
 6         Apple apple3 = new Apple("蘋果三");
 7         ls.push(apple1);
 8         ls.push(apple2);
 9         ls.push(apple3);
10         
11         System.out.println(ls.pop());
12         System.out.println(ls.pop());
13         System.out.println(ls.pop());
14     }
15 }
16 class LinkedStack {
17     private LinkedList<Apple> list = new LinkedList<Apple>();
18     public void push(Apple apple){
19         list.addLast(apple);
20     }
21     public Apple pop(){
22         return list.removeLast();
23     }
24 }
25 class Apple{
26     String name;
27     public Apple() {
28     }
29     public Apple(String name) {
30         super();
31         this.name = name;
32     }
33     public String getName() {
34         return name;
35     }
36     public void setName(String name) {
37         this.name = name;
38     }
39     @Override
40     public String toString() {
41         return "聖誕蘋果 [name=" + name + "]";
42     }
43 }

輸出結果為:

聖誕蘋果 [name=蘋果三]
聖誕蘋果 [name=蘋果二]
聖誕蘋果 [name=蘋果一]

可以看到,先進後出的特點。

1.2 Set

  Set是一種不包括重復元素的Collection,即它裏面的任意兩個元素a,b,都有a.equals(b)=false。

  很明顯的可以知道Set有個約束條件,傳入的collection參數不包含重復元素。

  1.2.1 HashSet

  哈希結構,特點是無序不重復,請看案例:

 1 public class HashSetTest_1 {
 2     public static void main(String[] args) {
 3         Set<String> set = new HashSet<>();
 4         set.add("第一個");
 5         set.add("第二個");
 6         set.add("第三個");
 7         set.add("第一個");
 8         set.add("第四個");
 9         System.out.println(set.size());//4
10         for(String str:set){
11             System.out.println(str);
12         }
13     }
14 }

輸出結果:

4
第二個
第四個
第三個
第一個

可以看到:1.我在set中添加了五個元素,有相同的元素,值讀出了一個。說明了不重復的特點。

2.輸出的結果順序,與我添加的順序完全不同,則說明了它的無序特點。

2.Map

  Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。

2.1 HashMap

  多用於通過鍵值獲取值得查詢。與HashMap類似的有HashTable,這裏就不祥說區別了。這個HashMap的用法,我就不貼代碼了,請諒解。


  以上,就是作為一只小白,在最近學的知識,做出了自己的一點理解,文中如果有不對的地方,還請各位大佬們,給我指出來。

如果需要更多的學習與資源請點擊以下鏈接:

知了堂官網:

www.zhiliaotang.com

【知了堂學習筆記】java中常用集合的理解