Java集合框架是Java标准类库的一部分,提供了一组性能优化的接口和类,用于表示和操作集合,例如列表、栈、队列、集和映射。Java集合框架主要位于java.util
包下。
核心接口
Java集合框架定义了几个核心接口,这些接口是集合框架的基础:
-
Collection:单个元素序列的根接口。它提供了添加、删除、清空集合以及大小和迭代等基本方法。
-
List:有序集合(有时称为序列)。此接口允许精确控制列表中每个元素的插入位置,并且可以通过索引访问元素。
-
Set:不允许重复元素的集合。它模拟了数学上的集合概念。
-
SortedSet:扩展了Set接口,保证元素排序。
-
NavigableSet:扩展了SortedSet,提供了导航方法来返回给定搜索目标的最接近匹配项。
-
Queue:先进先出(FIFO)的集合。队列通常用于任务调度。
-
Deque:双端队列,允许我们在两端插入和移除元素。
-
Map:键值对的集合。不是Collection的子接口,因为它的行为与单值集合有较大不同。
-
SortedMap:扩展了Map,保证键排序。
-
NavigableMap:扩展了SortedMap,提供了导航方法。
核心实现类
对应于上述接口,集合框架提供了一系列的实现类:
-
ArrayList:基于动态数组实现的List,提供快速的随机访问能力。
-
LinkedList:基于双向链表实现的List,优化了插入、删除操作。
-
HashSet:基于哈希表实现的Set,存储无序唯一元素。
-
LinkedHashSet:基于哈希表和链表实现,维护了插入顺序。
-
TreeSet:基于红黑树实现的NavigableSet,元素自然排序或根据Comparator排序。
-
PriorityQueue:基于优先级堆实现的Queue,元素按照自然顺序或根据Comparator进行排序。
-
ArrayDeque:基于动态数组实现的Deque,是一个高效的双端队列。
-
HashMap:基于哈希表实现的Map,存储键值对,提供快速访问。
-
LinkedHashMap:基于哈希表和链表实现的Map,维护了插入顺序或访问顺序。
-
TreeMap:基于红黑树实现的NavigableMap,键自然排序或根据Comparator排序。
迭代器
- Iterator:迭代器接口,用于遍历集合中的元素,提供
hasNext
、next
和remove
方法。 - ListIterator:扩展了Iterator,允许双向遍历列表和修改元素。
用法示例
以下是一些使用Java集合框架的基本示例:
List示例
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
for (String language : list) {
System.out.println(language);
}
Set示例
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.add("Java");
for (String language : set) {
System.out.println(language); // 输出不包含重复元素
}
Map示例
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
map.put("Orange", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
在这个Map
示例中,通过使用entrySet()
方法,我们能够迭代map
中的每个键值对,并打印出来。
Queue示例
Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");
queue.offer("Third");
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // 依次输出并移除队列头部元素
}
在这个Queue
示例中,使用offer
方法将元素添加到队列的尾部,并使用poll
方法将它们从队列的头部移除。
Deque示例
Deque<String> stack = new ArrayDeque<>();
stack.push("First");
stack.push("Second");
stack.push("Third");
while (!stack.isEmpty()) {
System.out.println(stack.pop()); // 作为栈使用,后进先出
}
在这个Deque
示例中,使用push
方法将元素压入栈顶,并使用pop
方法将它们从栈顶移除,符合后进先出的原则。
Collections类
java.util.Collections
是一个包含有关集合操作的静态方法的类,例如排序、搜索和线程安全转换。
List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 1, 2, 4));
Collections.sort(numbers); // 排序
for (int number : numbers) {
System.out.println(number); // 输出排序后的列表
}
// 创建一个不可修改的集合
List<Integer> unmodifiableList = Collections.unmodifiableList(numbers);
在这个Collections
示例中,我们使用sort
方法对一个整数List
进行排序,然后使用unmodifiableList
方法创建了一个不可修改的列表视图。
总结
Java集合框架提供了一套性能优化的集合类和接口,以及与之配套的算法。它们极大地简化了集合的处理,是Java程序开发中不可或缺的一部分。通过熟练地使用集合框架,可以提高编码效率,增强程序的健壮性和可维护性。