目录
1.Java 集合整体体系(单列 / 双列区分)
2.Collection 顶层父接口(所有单列集合通用方法)
3.单列集合三种通用遍历:迭代器、增强 for、Lambda forEach
4.List 接口:特点、独有索引方法、5 种遍历方式
5.四大基础数据结构(栈 / 队列 / 数组 / 链表)底层特性
一、Java 集合整体体系
1.两大分类
- 单列集合 Collection:每次只能存单个元素(一次添加一个)
- 双列集合 Map:每次存一对键值对 (key-value)(一次存两个关联数据,如商品名 + 价格)
2.Collection 下两大分支(接口)
(1)List 系列(有序、可重复、有索引)
实现类:ArrayList、LinkedList、Vector(过时,了解即可)
•有序:存入顺序 = 取出顺序(和大小排序无关)
•可重复:允许存放相同元素
•有索引:可以通过下标获取 / 修改元素
(2)Set 系列(无序、不可重复、无索引)
实现类:HashSet、TreeSet、LinkedHashSet
•无序:存入、取出顺序可能不一致
•不重复:自动去重(业务常用去重场景)
•无索引:不能通过下标操作元素
标识区分
红色 = 接口(不能 new 对象),蓝色 = 实现类(可直接创建对象)
我们之前学的 ArrayList 只是集合体系冰山一角。
二、Collection 顶层父接口
核心结论
Collection 是所有单列集合的祖宗接口,List、Set 全部继承它,里面所有方法单列集合通用。
Collection 是接口,不能直接 new,创建对象要用多态:Collection coll = new ArrayList<>();
Collection 6 大通用方法
1.add (E e) 添加元素
返回 boolean:
•List 集合:永远返回 true(允许重复)
•Set 集合:元素不存在 true,元素已存在 false(去重机制)
2.clear () 清空集合
删除集合内所有元素,集合变为空集合。
3.remove (Object o) 根据对象删除
⚠️ 注意:Collection 通用方法只能传对象,不能传索引(Set 无索引,无法统一提供按索引删除)
返回 boolean:元素存在删除成功 true,不存在 false。
4.contains (Object o) 判断是否包含元素
底层核心考点
底层依赖equals()方法对比对象:
•字符串、包装类:Java 已经重写 equals,对比内容,直接使用
•自定义类(Student/Teacher 等):默认用 Object 的 equals,对比地址值,内容相同不同对象会返回 false;必须手动重写 equals 方法(Alt+Insert 快速生成)
示例:两个 name、age 完全相同的 Student 对象,不重写 equals,coll.contains (新学生) 结果为 false。
5.isEmpty () 判断集合是否为空
底层判断集合 size ()==0,空返回 true,有元素 false。
6.size () 获取集合元素个数,返回 int
三、Collection 三种通用遍历方式
Set 无索引,普通 for 循环(靠下标)不能用,以下三种 List/Set 全部通用。
方式 1:迭代器 Iterator(无索引遍历,遍历中可删除)
1.使用三步
1.获取迭代器:Iterator it = coll.iterator(); 指针默认在集合 0 号元素前
2.boolean hasNext():判断指针下一位是否有元素,有 true 无 false
3.E next():①取出下一个元素 ②指针向后移动一位
基础代码模板:
Iterator<String>it=coll.iterator();while(it.hasNext()){Strings=it.next();System.out.println(s);}4.迭代器 4 大必记坑点
- 无元素时调用 next () → NoSuchElementException 无元素异常(不是下标越界,迭代器无索引)
- 遍历完毕指针不会自动复位,再次遍历需要重新获取新迭代器
- 一次 hasNext 只能配套一次 next;循环内多次 next 会跳过元素、直接报错,需要先用变量接收元素
- 遍历过程中,不能用集合 add/remove 方法,会抛出ConcurrentModificationException并发修改异常
○解决:需要删除用迭代器自带it.remove();迭代器无 add 方法,遍历中无法新增元素
方式 2:增强 for 循环(JDK5,底层迭代器,仅遍历)
适用范围
所有单列集合、数组;双列 Map 不能直接使用
格式:for(元素类型 变量 : 集合/数组){}
快捷生成:集合名.for 回车自动补全
示例:
for(Strings:coll){System.out.println(s);}细节
循环内的变量只是拷贝副本,修改变量不会改变原集合中的元素。
方式 3:forEach Lambda 遍历(JDK8,最简仅遍历)
集合forEach()方法,参数为 Consumer 函数式接口
1.完整匿名内部写法
2.简化 Lambda 写法(一行打印)
java
coll.forEach(s->System.out.println(s));底层:普通 for 循环遍历,依次把每个元素传给 accept 方法执行操作。
三种遍历选择场景
1.遍历过程需要删除元素 → 迭代器 Iterator
2.仅查看、无需增删 → 增强 for / Lambda forEach(代码最简)
四、List 接口(有序可重复有索引)
基础特性
继承 Collection,拥有上面全部 6 个方法 + 3 种通用遍历;
独有特性:有索引,提供基于下标操作的 4 个特有方法。
List 四大独有索引方法
1.add(int index,E e):指定下标插入元素,原元素整体后移
2.E remove(int index):按下标删除,返回被删除元素
⚠️ 重载坑:list.remove(1),实参 int 优先匹配下标删除;如果要删除数字 1 这个 Integer 对象,需要手动装箱Integer.valueOf(1)
3.set(int index,E e):修改指定下标元素,返回旧元素
4.E get(int index):根据下标获取元素,可配合 size () 实现普通 for 循环
List 共 5 种遍历方式
1.迭代器 Iterator(通用)
2.增强 for(通用)
3.Lambda forEach(通用)
4.普通 for 循环(独有,依靠 get+size,需要下标时使用)
5.ListIterator 列表迭代器(List 独有,Set 不能用)
ListIterator 列表迭代
继承 Iterator,新增:
- add(E e):遍历过程中添加元素(不会并发修改异常)
- hasPrevious() / previous() 反向遍历(前提:先正向走完指针到末尾,初始指针在头部直接反向会报错)
遍历场景选择
•仅遍历:增强 for / Lambda
•遍历要删除:Iterator
•遍历要新增:ListIterator(List 专属)
•需要操作下标:普通 for 循环
五、四大基础数据结构(ArrayList/LinkedList 底层原理前置)
1.栈 Stack
特点:先进后出,后进先出
结构:单端开口(栈顶),一端封闭;数据栈顶进、栈顶出。
2.队列 Queue
特点:先进先出,后进后出
结构:两端开口;后端入队,前端出队。
3.数组(ArrayList 底层)
内存:连续整块空间
优点:根据索引查询速度极快
缺点:中间 / 头部增删,后续元素全部移位,效率低
4.链表(LinkedList 底层,分单向 / 双向)
基础单元:节点(存储数据 + 下一个节点地址),内存不连续
单向链表:只能从头向后遍历
双向链表:节点存前驱 + 后继地址,头尾双向查找,查询效率提升
优点:增删只修改节点地址,无需移动大量元素,速度快
缺点:无随机索引,查询必须从头遍历,速度慢
四大结构对比速记
- 栈:先进后出
- 队列:先进先出
- 数组:查询快,增删慢
- 链表:查询慢,增删快
拓展
ArrayList 底层是数组;LinkedList 底层是双向链表,二者增删查询性能完全相反,业务按需选择。Vector 数组结构、线程安全,性能差,开发淘汰。