在Java中,集合类(Collection Framework)是一组用于存储和操作对象的类和接口。这些集合类提供了各种数据结构和算法,使得开发者可以方便地进行数据的存储、检索、排序和操作。下面我们将详细讲解Java中常见的集合类,并通过示例代码来帮助大家更好地理解。
1. 集合类的层次结构
Java集合框架主要由以下几个核心接口和类组成:
-
Collection:集合层次结构的根接口,定义了集合的基本操作。
- List:有序集合,允许重复元素。
ArrayList
LinkedList
- Set:无序集合,不允许重复元素。
HashSet
TreeSet
- Queue:队列,先进先出(FIFO)。
LinkedList
PriorityQueue
- List:有序集合,允许重复元素。
-
Map:键值对集合,每个键对应一个值。
HashMap
TreeMap
2. List 接口及其实现类
List 接口表示有序的集合,允许重复元素。常见的实现类有 ArrayList
和 LinkedList
。
2.1 ArrayList
ArrayList
是基于动态数组实现的,支持随机访问,插入和删除操作较慢。
示例代码:
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
arrayList.add("Cherry");
for (String fruit : arrayList) {
System.out.println(fruit);
}
}
}
2.2 LinkedList
LinkedList
是基于双向链表实现的,插入和删除操作较快,随机访问较慢。
示例代码:
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> linkedList = new LinkedList<>();
linkedList.add("Apple");
linkedList.add("Banana");
linkedList.add("Cherry");
for (String fruit : linkedList) {
System.out.println(fruit);
}
}
}
3. Set 接口及其实现类
Set 接口表示无序的集合,不允许重复元素。常见的实现类有 HashSet
和 TreeSet
。
3.1 HashSet
HashSet
是基于哈希表实现的,插入、删除和查找操作效率高。
示例代码:
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Cherry");
hashSet.add("Apple"); // 重复元素不会被添加
for (String fruit : hashSet) {
System.out.println(fruit);
}
}
}
3.2 TreeSet
TreeSet
是基于红黑树实现的,元素有序,插入、删除和查找操作效率较高。
示例代码:
import java.util.Set;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
Set<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Cherry");
treeSet.add("Apple"); // 重复元素不会被添加
for (String fruit : treeSet) {
System.out.println(fruit);
}
}
}
4. Queue 接口及其实现类
Queue 接口表示队列,先进先出(FIFO)。常见的实现类有 LinkedList
和 PriorityQueue
。
4.1 LinkedList
LinkedList
也可以作为队列使用,支持队列的基本操作。
示例代码:
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.offer("Alice");
queue.offer("Bob");
queue.offer("Charlie");
while (!queue.isEmpty()) {
System.out.println("Polled: " + queue.poll());
}
}
}
4.2 PriorityQueue
PriorityQueue
是基于优先级堆实现的,元素按优先级顺序出队。
示例代码:
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueExample {
public static void main(String[] args) {
Queue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.offer(10);
priorityQueue.offer(20);
priorityQueue.offer(15);
while (!priorityQueue.isEmpty()) {
System.out.println("Polled: " + priorityQueue.poll());
}
}
}
5. Map 接口及其实现类
Map 接口表示键值对集合,每个键对应一个值。常见的实现类有 HashMap
和 TreeMap
。
5.1 HashMap
HashMap
是基于哈希表实现的,插入、删除和查找操作效率高。
示例代码:
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 1);
hashMap.put("Banana", 2);
hashMap.put("Cherry", 3);
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
5.2 TreeMap
TreeMap
是基于红黑树实现的,键有序,插入、删除和查找操作效率较高。
示例代码:
import java.util.Map;
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Apple", 1);
treeMap.put("Banana", 2);
treeMap.put("Cherry", 3);
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
总结
- List:有序集合,允许重复元素。
ArrayList
:基于动态数组。LinkedList
:基于双向链表。
- Set:无序集合,不允许重复元素。
HashSet
:基于哈希表。TreeSet
:基于红黑树。
- Queue:队列,先进先出(FIFO)。
LinkedList
:基于双向链表。PriorityQueue
:基于优先级堆。
- Map:键值对集合,每个键对应一个值。
HashMap
:基于哈希表。TreeMap
:基于红黑树。
通过以上详细的概念解释和编程示例,相信大家已经对Java中常见的集合类有了更深入的理解。在实际编程中,根据具体需求选择合适的集合类,可以提高程序的性能和可维护性。