引言
????????在 Java 編程中,集合是一個非常重要的概念。它就像是一個容器,能夠存儲多個數據元素,幫助我們更方便地管理和操作數據。Java 集合框架主要分為單列集合和雙列集合兩大類,它們各自有著獨特的特點和適用場景。接下來,讓我們深入探究這兩種集合。
單列集合
單列集合就像是一列整齊排列的數據隊伍,每個元素都是獨立的個體,按照一定的規則存儲和組織。在 Java 中,單列集合的根接口是?java.util.Collection
,它派生了多個子接口和實現類。
1.?List
?接口
List
?接口的特點是元素有序且可重復。這意味著我們可以通過索引來訪問集合中的元素,就像在書架上按照編號查找書籍一樣。常見的?List
?實現類有?ArrayList
?和?LinkedList
。
ArrayList
ArrayList
?基于數組實現,它在內存中是連續存儲的。這使得它在隨機訪問元素時非常高效,就像在一本裝訂好的書中快速翻到指定頁碼一樣。以下是一個簡單的示例:
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("apple");list.add("banana");list.add("cherry");System.out.println(list.get(1)); // 輸出: banana}
}
不過,ArrayList
?在插入和刪除元素時可能會比較低效,因為需要移動后續的元素。
LinkedList
LinkedList
?基于鏈表實現,元素之間通過引用相互連接。這使得它在插入和刪除元素時非常高效,就像在一列火車中添加或移除車廂一樣。但隨機訪問元素時效率較低,因為需要從頭開始遍歷鏈表。示例如下:
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> list = new LinkedList<>();list.add("apple");list.add("banana");list.add("cherry");list.add(1, "date");System.out.println(list); // 輸出: [apple, date, banana, cherry]}
}
2.?Set
?接口
Set
?接口的特點是元素無序且不可重復。這就好比一個裝滿不同顏色氣球的袋子,每個氣球都是獨一無二的,并且沒有固定的排列順序。常見的?Set
?實現類有?HashSet
?和?TreeSet
。
HashSet
HashSet
?基于哈希表實現,它通過哈希值來存儲和查找元素。這使得它在添加、刪除和查找元素時具有較高的效率。示例如下:
import java.util.HashSet;
import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("apple");set.add("banana");set.add("apple"); // 重復元素,不會被添加System.out.println(set); // 輸出: [apple, banana]}
}
TreeSet
TreeSet
?基于紅黑樹實現,它可以對元素進行排序。這就像一個按照字母順序排列的字典,方便我們查找和比較元素。示例如下:
import java.util.TreeSet;
import java.util.Set;public class TreeSetExample {public static void main(String[] args) {Set<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println(set); // 輸出: [1, 2, 3]}
}
雙列集合
雙列集合就像是一個表格,每一行都包含兩個部分:鍵(Key)和值(Value)。鍵是唯一的,就像表格的索引,通過鍵可以快速找到對應的值。在 Java 中,雙列集合的根接口是?java.util.Map
。
1.?HashMap
HashMap
?基于哈希表實現,它通過鍵的哈希值來存儲和查找元素。這使得它在添加、刪除和查找元素時具有較高的效率。示例如下:
import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("cherry", 3);System.out.println(map.get("banana")); // 輸出: 2}
}
需要注意的是,HashMap
?不保證元素的順序。
2.?TreeMap
TreeMap
?基于紅黑樹實現,它可以根據鍵的自然順序或指定的比較器對元素進行排序。這就像一個按照字母順序排列的電話簿,方便我們查找和比較元素。示例如下:
import java.util.TreeMap;
import java.util.Map;public class TreeMapExample {public static void main(String[] args) {Map<String, Integer> map = new TreeMap<>();map.put("banana", 2);map.put("apple", 1);map.put("cherry", 3);System.out.println(map); // 輸出: {apple=1, banana=2, cherry=3}}
}
3.?LinkedHashMap
LinkedHashMap
?是?HashMap
?的子類,它不僅具有?HashMap
?的高效性,還能保持元素的插入順序。示例如下:
import java.util.LinkedHashMap;
import java.util.Map;public class LinkedHashMapExample {public static void main(String[] args) {Map<String, Integer> map = new LinkedHashMap<>();map.put("banana", 2);map.put("apple", 1);map.put("cherry", 3);System.out.println(map); // 輸出: {banana=2, apple=1, cherry=3}}
}