|
@@ -14,7 +14,7 @@ Java 中分为**基本数据类型**和**引用数据类型**。Java 的核心
|
|
|
|
|
|
|
|
为了解决这个问题,Java 为每个基本数据类型都设置了对应的引用数据类型,即**包装器类(Wrapper Classes)**。
|
|
为了解决这个问题,Java 为每个基本数据类型都设置了对应的引用数据类型,即**包装器类(Wrapper Classes)**。
|
|
|
|
|
|
|
|
-> 📄 来源:`Demo01.java`
|
|
|
|
|
|
|
+> 📄 来源:`packaging/Demo01.java`
|
|
|
|
|
|
|
|
### 1.2 基本类型与包装类的对应关系
|
|
### 1.2 基本类型与包装类的对应关系
|
|
|
|
|
|
|
@@ -31,7 +31,7 @@ Java 中分为**基本数据类型**和**引用数据类型**。Java 的核心
|
|
|
|
|
|
|
|
包装器类具有属性和方法,属于引用数据类型。
|
|
包装器类具有属性和方法,属于引用数据类型。
|
|
|
|
|
|
|
|
-> 📄 来源:`Demo01.java`
|
|
|
|
|
|
|
+> 📄 来源:`packaging/Demo01.java`
|
|
|
|
|
|
|
|
### 1.3 装箱(Boxing)与拆箱(Unboxing)
|
|
### 1.3 装箱(Boxing)与拆箱(Unboxing)
|
|
|
|
|
|
|
@@ -53,7 +53,7 @@ int a1 = integer.intValue(); // 调用 intValue() 方法拆箱
|
|
|
int a2 = i; // Integer → int,自动拆箱
|
|
int a2 = i; // Integer → int,自动拆箱
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-> 📄 来源:`Demo01.java`
|
|
|
|
|
|
|
+> 📄 来源:`packaging/Demo01.java`
|
|
|
|
|
|
|
|
### 1.4 自动装箱与拆箱的底层原理
|
|
### 1.4 自动装箱与拆箱的底层原理
|
|
|
|
|
|
|
@@ -84,7 +84,7 @@ public class Person {
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-> 📄 来源:`Person.java`
|
|
|
|
|
|
|
+> 📄 来源:`packaging/Person.java`
|
|
|
|
|
|
|
|
### 1.7 包装类的常用方法
|
|
### 1.7 包装类的常用方法
|
|
|
|
|
|
|
@@ -126,9 +126,134 @@ System.out.println(c.equals(d)); // true
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 二、随堂练习要点
|
|
|
|
|
|
|
+## 二、集合框架入门(Collection Framework)
|
|
|
|
|
|
|
|
-本日课程重点在于理解包装类的设计思想和使用方式:
|
|
|
|
|
|
|
+### 2.1 集合的概念
|
|
|
|
|
+
|
|
|
|
|
+**集合(Collection)** 是用来存储 Java 变量、对象的容器,也称为集合容器。
|
|
|
|
|
+
|
|
|
|
|
+与数组一样,集合也是容器,可以存储多个数据。但二者有显著区别:
|
|
|
|
|
+
|
|
|
|
|
+| 对比维度 | 数组 | 集合 |
|
|
|
|
|
+|---------|------|------|
|
|
|
|
|
+| **长度** | 一旦创建,长度不可变 | 长度可变,可动态增减 |
|
|
|
|
|
+| **存储类型** | 可存储基本数据类型和引用数据类型 | **只能存储引用数据类型**(若需存基本类型,须用对应的包装类) |
|
|
|
|
|
+| **元素类型** | 只能存储同一种数据类型(类型固定) | 可存储多种数据类型(但建议存储单一类型,以便泛型约束) |
|
|
|
|
|
+
|
|
|
|
|
+> 📄 来源:`collection/Demo01.java`
|
|
|
|
|
+
|
|
|
|
|
+### 2.2 集合的体系结构
|
|
|
|
|
+
|
|
|
|
|
+Java 的集合框架分为两大派系:
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+Collection(单列集合) Map(双列集合)
|
|
|
|
|
+ / \ / \
|
|
|
|
|
+ List Set HashMap TreeMap
|
|
|
|
|
+ /\ /\ LinkedHashMap
|
|
|
|
|
+ArrayList HashSet
|
|
|
|
|
+LinkedList TreeSet
|
|
|
|
|
+Vector LinkedHashSet
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+- **Collection**、**Map**、**List**、**Set** 都是 **接口(Interface)**,只定义规则,不实现
|
|
|
|
|
+- 具体功能由它们的 **实现类** 完成
|
|
|
|
|
+
|
|
|
|
|
+**Collection(单列集合)**:
|
|
|
|
|
+- **List**(有序集合):元素有顺序,可重复
|
|
|
|
|
+ - `ArrayList`:数组结构实现
|
|
|
|
|
+ - `LinkedList`:链表结构实现
|
|
|
|
|
+ - `Vector`:早期版本,线程安全
|
|
|
|
|
+- **Set**(无序集合):元素无顺序,不可重复
|
|
|
|
|
+ - `HashSet`:哈希表实现
|
|
|
|
|
+ - `TreeSet`:红黑树实现(可排序)
|
|
|
|
|
+ - `LinkedHashSet`:可保持插入顺序
|
|
|
|
|
+
|
|
|
|
|
+**Map(双列集合)**:
|
|
|
|
|
+- 由 **键(Key)** 和 **值(Value)** 组成
|
|
|
|
|
+- **Key** 在集合中是唯一的,不能重复
|
|
|
|
|
+- **Value** 可以重复
|
|
|
|
|
+
|
|
|
|
|
+> 📄 来源:`collection/Demo01.java`
|
|
|
|
|
+
|
|
|
|
|
+### 2.3 List 与底层数据结构
|
|
|
|
|
+
|
|
|
|
|
+集合被称为**集合框架**,因为它把底层数据结构进行了封装。
|
|
|
|
|
+
|
|
|
|
|
+**List** 直译为"列表",对应数据结构中的**线性表结构**。线性表结构大致分为四种:
|
|
|
|
|
+
|
|
|
|
|
+#### 2.3.1 栈结构(Stack)
|
|
|
|
|
+
|
|
|
|
|
+- **特点**:先进后出(LIFO — Last In First Out)
|
|
|
|
|
+- **操作术语**:
|
|
|
|
|
+ - 加入元素 → **入栈 / 压栈(push)**
|
|
|
|
|
+ - 移除元素 → **出栈 / 弹栈(pop)**
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+入栈顺序: A → B → C
|
|
|
|
|
+出栈顺序: C → B → A
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 2.3.2 队列结构(Queue)
|
|
|
|
|
+
|
|
|
|
|
+- **特点**:先进先出(FIFO — First In First Out)
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+入队顺序: A → B → C
|
|
|
|
|
+出队顺序: A → B → C
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 2.3.3 数组结构(Array)
|
|
|
|
|
+
|
|
|
|
|
+- 在内存中开辟一段**连续的空间**存储数据
|
|
|
|
|
+- **优点**:查询速度快,可通过索引快速定位(`arr[index]`)
|
|
|
|
|
+- **缺点**:增删速度慢,因为需要移动后续元素
|
|
|
|
|
+- **对应实现类**:`ArrayList`
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+索引: [0] [1] [2] [3] [4] [5]
|
|
|
|
|
+值: 10 20 30 40 50 60
|
|
|
|
|
+ ↑ 连续存储空间
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 2.3.4 链表结构(Linked List)
|
|
|
|
|
+
|
|
|
|
|
+- 在内存中**不连续**存储,不需要开辟连续的存储空间
|
|
|
|
|
+- 每个节点(Node)包含数据 + 指向下一个节点的指针(地址)
|
|
|
|
|
+- **优点**:增删速度快,只需改变相邻节点的指针
|
|
|
|
|
+- **缺点**:随机查询速度慢,需要从头结点依次遍历查找
|
|
|
|
|
+- **对应实现类**:`LinkedList`
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+头结点 → Node1 → Node2 → Node3 → null
|
|
|
|
|
+ data data data
|
|
|
|
|
+ next→ next→ next→
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 2.3.5 List 实现类的数据结构对应
|
|
|
|
|
+
|
|
|
|
|
+| 实现类 | 对应数据结构 | 查询特点 | 增删特点 |
|
|
|
|
|
+|--------|-------------|---------|---------|
|
|
|
|
|
+| `ArrayList` | 数组(Array) | 快(索引定位) | 慢(元素移动) |
|
|
|
|
|
+| `LinkedList` | 链表(Linked List)、队列(Queue)、栈(Stack) | 慢(从头遍历) | 快(改指针) |
|
|
|
|
|
+
|
|
|
|
|
+> 📄 来源:`collection/Demo02.java`
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 三、随堂练习要点
|
|
|
|
|
+
|
|
|
|
|
+### 本日课程知识点概览
|
|
|
|
|
+
|
|
|
|
|
+| 知识点 | 说明 | 对应文件 |
|
|
|
|
|
+|--------|------|---------|
|
|
|
|
|
+| 包装类概念 | 8种基本类型→包装类,装箱/拆箱 | `packaging/Demo01.java` |
|
|
|
|
|
+| 包装类在 Bean 中的应用 | `Integer` 替代 `int` | `packaging/Person.java` |
|
|
|
|
|
+| 包装类缓存机制 | -128~127 缓存池,`==` vs `equals()` | — |
|
|
|
|
|
+| 集合框架概述 | 集合 vs 数组对比,体系结构 | `collection/Demo01.java` |
|
|
|
|
|
+| 线性表数据结构 | 栈/队列/数组/链表 特点 | `collection/Demo02.java` |
|
|
|
|
|
+
|
|
|
|
|
+### 包装类重点
|
|
|
|
|
|
|
|
1. **概念理解**:为什么 Java 需要包装类?基本类型和包装类各有什么优劣?
|
|
1. **概念理解**:为什么 Java 需要包装类?基本类型和包装类各有什么优劣?
|
|
|
2. **装箱/拆箱操作**:手动 vs 自动,理解编译器的底层转换逻辑
|
|
2. **装箱/拆箱操作**:手动 vs 自动,理解编译器的底层转换逻辑
|
|
@@ -138,10 +263,20 @@ System.out.println(c.equals(d)); // true
|
|
|
- 包装类对象参与算术运算时的自动拆箱
|
|
- 包装类对象参与算术运算时的自动拆箱
|
|
|
- `null` 包装类拆箱会抛出 `NullPointerException`
|
|
- `null` 包装类拆箱会抛出 `NullPointerException`
|
|
|
|
|
|
|
|
|
|
+### 集合框架重点
|
|
|
|
|
+
|
|
|
|
|
+1. **理解集合 vs 数组的区别**:长度可变性、元素类型限制
|
|
|
|
|
+2. **记忆体系结构**:Collection(List / Set)和 Map 两大分支
|
|
|
|
|
+3. **掌握四种线性表结构**:栈(LIFO)、队列(FIFO)、数组(查询快增删慢)、链表(增删快查询慢)
|
|
|
|
|
+4. **关联实现类**:`ArrayList` → 数组,`LinkedList` → 链表/队列/栈
|
|
|
|
|
+
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 三、拓展阅读
|
|
|
|
|
|
|
+## 四、拓展阅读
|
|
|
|
|
|
|
|
- [Oracle Java 官方文档 — Autoboxing and Unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)
|
|
- [Oracle Java 官方文档 — Autoboxing and Unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)
|
|
|
- [Java 包装类缓存机制详解](https://www.baeldung.com/java-integer-cache)
|
|
- [Java 包装类缓存机制详解](https://www.baeldung.com/java-integer-cache)
|
|
|
|
|
+- [Oracle Java 官方文档 — Collections Framework Overview](https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html)
|
|
|
|
|
+- [Java 集合框架详解:List、Set、Map 的区别](https://www.baeldung.com/java-collections)
|
|
|
- 《Java 核心技术 卷I》第 3 章 — 包装器类与自动装箱
|
|
- 《Java 核心技术 卷I》第 3 章 — 包装器类与自动装箱
|
|
|
|
|
+- 《Java 核心技术 卷I》第 9 章 — 集合
|