在 Java 中,集合(Collections)是用于存储多个元素的容器。Java Collections Framework 提供了丰富的集合类,用于满足不同的数据存储需求。以下是一些常用的 Java 集合类及其常用方法,以及简单的例子来说明它们的用法。
List 接口
List 接口代表一个有序的元素集合,元素可以重复,并且允许元素为 `null`。
1. **`ArrayList`**
- `add(E e)`: 添加元素。
- `remove(Object o)`: 移除元素。
- `get(int index)`: 获取指定索引的元素。
- `size()`: 获取集合大小。
ArrayList<String> myList = new ArrayList<>();
myList.add("Apple");
myList.add("Banana");
String secondElement = myList.get(1); // 获取索引为 1 的元素
myList.remove("Banana"); // 移除元素 "Banana"
2. **`LinkedList`**
- `addFirst(E e)`: 在列表开头添加元素。
- `addLast(E e)`: 在列表末尾添加元素。
- `removeFirst()`: 移除列表开头的元素。
- `removeLast()`: 移除列表末尾的元素。
LinkedList<String> myList = new LinkedList<>();
myList.addFirst("Apple");
myList.addLast("Banana");
String firstElement = myList.removeFirst(); // 移除并获取列表开头的元素
Set 接口
Set 接口代表一个无序的元素集合,元素不能重复。
1. **`HashSet`**
- `add(E e)`: 添加元素。
- `remove(Object o)`: 移除元素。
- `contains(Object o)`: 检查集合中是否包含指定元素。
- `size()`: 获取集合大小。
HashSet<String> mySet = new HashSet<>();
mySet.add("Apple");
mySet.add("Banana");
boolean contains = mySet.contains("Banana"); // 检查集合中是否包含 "Banana"
2. **`TreeSet`**
- `add(E e)`: 添加元素。
- `remove(Object o)`: 移除元素。
- `contains(Object o)`: 检查集合中是否包含指定元素。
- `size()`: 获取集合大小。
- `first()`: 获取集合中的第一个元素。
- `last()`: 获取集合中的最后一个元素。
TreeSet<String> mySet = new TreeSet<>();
mySet.add("Apple");
mySet.add("Banana");
String firstElement = mySet.first(); // 获取集合中的第一个元素
Map 接口
Map 接口代表键值对的映射表,键不能重复。
1. **`HashMap`**
- `put(K key, V value)`: 添加键值对。
- `get(Object key)`: 获取指定键的值。
- `remove(Object key)`: 移除指定键的键值对。
- `size()`: 获取映射的大小。
- `isEmpty()`: 检查映射是否为空。
HashMap<String, String> myMap = new HashMap<>();
myMap.put("Key", "Value");
String value = myMap.get("Key"); // 获取键 "Key" 对应的值
myMap.remove("Key"); // 移除键 "Key"
2. **`TreeMap`**
- `put(K key, V value)`: 添加键值对。
- `get(Object key)`: 获取指定键的值。
- `remove(Object key)`: 移除指定键的键值对。
- `size()`: 获取映射的大小。
- `isEmpty()`: 检查映射是否为空。
- `firstKey()`: 获取映射中的第一个键。
- `lastKey()`: 获取映射中的最后一个键。
TreeMap<String, String> myMap = new TreeMap<>();
myMap.put("Key", "Value");
String value = myMap.get("Key"); // 获取键 "Key" 对应的值
myMap.remove("Key"); // 移除键 "Key"
Queue 接口
Queue 接口代表一个先进先出(FIFO)的元素队列。
1. **`PriorityQueue`**
- `add(E e)`: 添加元素。
- `remove()`: 移除队列头部元素。
- `peek()`: 获取队列头部元素,但不移除。
- `size()`: 获取队列大小。
PriorityQueue<String> myQueue = new PriorityQueue<>();
myQueue.add("Apple");
myQueue.add("Banana");
String head = myQueue.peek(); // 获取队列头部元素,但不移除
2. **`LinkedList`**
- `addFirst(E e)`: 在队列开头添加元素。
- `addLast(E e)`: 在队列末尾添加元素。
- `removeFirst()`: 移除队列开头的元素。
- `removeLast()`: 移除队列末尾的元素。
LinkedList<String> myQueue = new LinkedList<>();
myQueue.addFirst("Apple");
myQueue.addLast("Banana");
String firstElement = myQueue.removeFirst(); // 移除并获取队列开头的元素
迭代器(Iterators)
所有集合类都提供迭代器,用于遍历集合中的元素。
List<String> myList = Arrays.asList("Apple", "Banana", "Cherry");
Iterator<String> iterator = myList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
增强型集合类
Java 8 引入了增强型集合类,包括 `List`, `Set`, 和 `Map`。
1. **`List`**
- `stream()`: 创建列表的流。
- `forEach(Consumer<? super E> action)`: 遍历列表中的每个元素。
- `removeIf(Predicate<? super E> filter)`: 移除满足给定谓词的元素。
List<String> myList = Arrays.asList("Apple", "Banana", "Cherry");
myList.removeIf(s -> s.startsWith("A")); // 移除所有以 "A" 开头的元素
2. **`Set`**
- `stream()`: 创建集合的流。
- `forEach(Consumer<? super E> action)`: 遍历集合中的每个元素。
- `removeIf(Predicate<? super E> filter)`: 移除满足给定谓词的元素。
Set<String> mySet = new HashSet<>();
mySet.add("Apple");
mySet.add("Banana");
mySet.removeIf(s -> s.length() > 5); // 移除所有长度大于 5 的字符串
3. **`Map`**
- `entrySet().stream()`: 创建映射项的流。
- `forEach(BiConsumer<? super K, ? super V> action)`: 遍历映射中的每个映射项。
- `removeIf(BiPredicate<? super K, ? super V> filter)`: 移除满足给定谓词的映射项。
Map<String, String> myMap = new HashMap<>();
myMap.put("Key1", "Value1");
myMap.put("Key2", "Value2");
myMap.entrySet().stream().filter(entry -> entry.getValue().startsWith("V")).forEach(entry -> myMap.remove(entry.getKey())); // 移除所有值以 "V" 开头的映射项
总结
Java 集合类是 Java 编程中不可或缺的部分,它们提供了丰富的方法和功能,以满足不同类型的数据存储和操作需求。通过学习这些集合类及其常用方法,你可以更有效地处理数据,并提高代码的效率和可读性。