集合框架概览

集合是存储和操作数据的核心工具,本课学习Java集合框架的整体结构。

为什么需要集合

数组有固定大小的限制,集合可以动态增长。

数组 vs 集合

特性 数组 集合
大小 固定 动态
类型 基本类型/对象 只能对象
方法 丰富的方法
泛型 不支持 支持

集合框架体系

TEXT
Collection(接口)
├── List(接口)— 有序,可重复
│   ├── ArrayList(实现类)
│   ├── LinkedList(实现类)
│   └── Vector(实现类)
├── Set(接口)— 无序,不重复
│   ├── HashSet(实现类)
│   ├── TreeSet(实现类)
│   └── LinkedHashSet(实现类)
└── Queue(接口)— 队列
    ├── LinkedList(实现类)
    └── PriorityQueue(实现类)

Map(接口)— 键值对
├── HashMap(实现类)
├── TreeMap(实现类)
├── LinkedHashMap(实现类)
└── Hashtable(实现类)

Collection接口

Collection是所有单值集合的父接口。

常用方法

方法 说明 返回值
add(E e) 添加元素 boolean
remove(Object o) 删除元素 boolean
contains(Object o) 是否包含 boolean
isEmpty() 是否为空 boolean
size() 元素数量 int
clear() 清空 void
toArray() 转数组 Object[]

示例:Collection基本操作

JAVA
import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        
        // 添加元素
        collection.add("Alice");
        collection.add("Bob");
        collection.add("Charlie");
        System.out.println("集合:" + collection);  // [Alice, Bob, Charlie]
        
        // 判断
        System.out.println("是否包含Alice:" + collection.contains("Alice"));  // true
        System.out.println("集合大小:" + collection.size());  // 3
        System.out.println("是否为空:" + collection.isEmpty());  // false
        
        // 删除
        collection.remove("Bob");
        System.out.println("删除后:" + collection);  // [Alice, Charlie]
        
        // 转数组
        Object[] array = collection.toArray();
        for (Object obj : array) {
            System.out.println(obj);
        }
        
        // 清空
        collection.clear();
        System.out.println("清空后大小:" + collection.size());  // 0
    }
}
▶ 试一试

Iterable与Iterator

Iterable接口

实现了Iterable的类可以用for-each遍历。

Iterator接口

迭代器,用于遍历集合。

方法 说明
hasNext() 是否有下一个元素
next() 获取下一个元素
remove() 删除当前元素

示例:使用Iterator

JAVA
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorDemo {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
        
        // 方式1:for-each
        for (String name : names) {
            System.out.println(name);
        }
        
        // 方式2:Iterator
        Iterator<String> it = names.iterator();
        while (it.hasNext()) {
            String name = it.next();
            System.out.println(name);
        }
        
        // 方式3:Iterator删除元素
        Iterator<String> it2 = names.iterator();
        while (it2.hasNext()) {
            String name = it2.next();
            if (name.startsWith("B")) {
                it2.remove();  // 安全删除
            }
        }
        System.out.println("删除后:" + names);  // [Alice, Charlie]
    }
}
▶ 试一试
⚠️ 注意: 遍历时删除元素要用Iterator的remove方法,不能用集合的remove方法,否则会抛出ConcurrentModificationException。

List接口

有序集合,元素可重复。

特点

特点 说明
有序 元素按插入顺序排列
可重复 可以有相同元素
索引访问 通过索引访问元素

常用方法

方法 说明
get(int index) 获取指定索引的元素
set(int index, E e) 设置指定索引的元素
add(int index, E e) 在指定位置插入
remove(int index) 删除指定索引的元素
indexOf(Object o) 查找元素索引
subList(int from, int to) 截取子列表

Set接口

无序集合,元素不可重复。

特点

特点 说明
无序 元素没有固定顺序
不重复 自动去重
无索引 不能通过索引访问

Map接口

键值对集合,键不可重复。

特点

特点 说明
键值对 每个元素包含键和值
键不重复 键唯一,值可重复
无序 HashMap无序

常用方法

方法 说明
put(K k, V v) 添加键值对
get(K k) 根据键获取值
remove(K k) 删除键值对
containsKey(K k) 是否包含键
keySet() 所有键的集合
values() 所有值的集合
entrySet() 所有键值对的集合

集合选择指南

需求 选择
有序,可重复 ArrayList
无序,不重复 HashSet
有序,不重复 LinkedHashSet
排序,不重复 TreeSet
键值对 HashMap
排序键值对 TreeMap

❓ 常见问题

Q ArrayList和LinkedList怎么选?
A 查询多用ArrayList,增删多用LinkedList。一般用ArrayList。
Q HashSet去重原理是什么?
A 先比较hashCode,再比较equals。两个都相同才认为是重复元素。
Q HashMap和Hashtable有什么区别?
A HashMap线程不安全但性能高,Hashtable线程安全但性能低。推荐用HashMap。

📖 小节

📝 作业

  1. 集合操作: 创建ArrayList,添加10个元素,遍历并删除偶数
  2. 去重练习: 将数组中的重复元素去除(用HashSet)
  3. Map练习: 统计字符串中每个字符出现的次数

下一课

下一课我们将学习 List与ArrayList,了解List的详细用法。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏