## 一、概述
在編程時,可以使用數組來保存多個對象,但數組長度不可變化,一旦在初始化數組時指定了數組長度,這個數組長度就是不可變的,如果需要保存數量變化的數據,數組就有點無能為力了。而且數組無法保存具有映射關系的數據,如成績表為語文一79,數學一80。這種數據看上去像兩個數組,但這兩個數組的元素之間有一定的關聯關系。
為了保存數量不確定的數據,以及保存具有映射關系的數據,[](http://c.biancheng.net/java/)Java 提供了集合類。Java 所有的集合類都位于 java.util 包下,提供了一個表示和操作對象集合的統一構架,包含大量集合接口,以及這些接口的實現類和操作它們的算法。
> 集合類和數組不一樣,數組元素既可以是基本類型的值,也可以是對象(實際上保存的是對象的引用變量);而集合里只能保存對象(實際上只是保存對象的引用變量,但通常習慣上認為集合里保存的是對象)。
集合框架是一個類庫的集合,包含實現集合的接口。
* Collection 接口:該接口是最基本的集合接口。
* List 接口:該接口實現了 Collection 接口。List 是有序集合,允許有相同的元素。使用 List 能夠精確地控制每個元素插入的位置,用戶能夠使用索引來訪問 List 中的元素,與數組類似。
* Set 接口:該接口也實現了 Collection 接口。它不能包含重復的元素,SortedSet 是按升序排列的 Set 集合。
* Map 接口:包含鍵值對,Map 不能包含重復的鍵。SortedMap 是一個按升序排列的 Map 集合。
:-: 
【選擇】下列不屬于 Collection 子接口的是()(選擇一項)
```
A. List B. Map C. Queue D. Set
```
## 二、Collection 接口
Collection 接口是 List 接口和 Set 接口的父接口,通常情況下不被直接使用。Collection 接口定義了一些通用的方法,通過這些方法可以實現對集合的基本操作。
| 方法名稱 | 說明 |
| --- | --- |
| boolean add(E e) | 向集合中添加一個元素,E 是元素的數據類型 |
| boolean addAll(Collection c) | 向集合中添加集合 c 中的所有元素 |
| void clear() | 刪除集合中的所有元素 |
| boolean contains(Object o) | 判斷集合中是否存在指定元素 |
| boolean containsAll(Collection c) | 判斷集合中是否包含集合 c 中的所有元素 |
| boolean isEmpty() | 判斷集合是否為空 |
| Iterator<E> iterator() | 返回一個 Iterator 對象,用于遍歷集合中的元素 |
| boolean remove(Object o) | 從集合中刪除一個指定元素 |
| boolean removeAll(Collection c) | 從集合中刪除所有在集合 c 中出現的元素 |
| boolean retainAll(Collection c) | 僅僅保留集合中所有在集合 c 中出現的元素 |
| int size() | 返回集合中元素的個數 |
| Object\[\] toArray() | 返回包含此集合中所有元素的數組 |
## 三、List 集合
List 接口實現了 Collection 接口,它主要有兩個實現類:ArrayList 類和 LinkedList 類。在 List 集合中允許出現重復元素。與 Set 集合不同的是,在 List 集合中的元素是有序的,可以根據索引位置來檢索 List 集合中的元素,第一個添加到 List 集合中的元素的索引為 0,第二個為 1,依此類推。
### 3.1 ArrayList 類
ArrayList 類提供了快速的基于索引的成員訪問方式,對尾部成員的增加和刪除支持較好。使用 ArrayList 創建的集合,允許對集合中的元素進行快速的隨機訪問,不過,向 ArrayList 中插入與刪除元素的速度相對較慢。
#### ArrayList 類的常用構造方法
* ArrayList():構造一個初始容量為 10 的空列表。
* ArrayList(Collection c):構造一個包含指定 Collection 的元素的列表,這些元素是按照該 Collection 的迭代器返回它們的順序排列的。
#### ArrayList 類的常用方法
| 方法名稱 | 說明 |
| --- | --- |
| E get(int index) | 獲取集合中指定索引位置的元素,E 為元素的數據類型 |
| int index(Object o) | 返回集合中第一次出現指定元素的索引,如果不包含該元素,則返回 -1 |
| int lastIndexOf(Object o) | 返回集合中最后一次出現指定元素的索引,如果不包含該元素,則返回 -1 |
| E set(int index, E e) | 將此集合中指定索引位置的元素修改為指定的對象。返回此集合中指定索引位置的原元素。 |
| List subList(int fromlndex, int tolndex) | 返回一個新的集合,新集合中包含 fromlndex 和 tolndex 索引之間的所有元素。包含 fromlndex 處的元素,不包含 tolndex 索引處的元素。 |
【例題】使用 ArrayList 類向集合中添加三個商品信息,包括商品編號、名稱和價格,然后遍歷集合輸出這些商品信息。
```
public class Product {
private int id; // 商品編號
private String name; // 名稱
private float price; // 價格
public Product(int id, String name, float price) {
this.name = name;
this.id = id;
this.price = price;
}
// 這里是上面3個屬性的setter/getter方法,這里省略
public String toString() {
return "商品編號:" + id + ",名稱:" + name + ",價格:" + price;
}
}
public class Test {
public static void main(String[] args) {
Product pd1 = new Product(4, "辣條", 10);
Product pd2 = new Product(5, "方便面", 12);
Product pd3 = new Product(3, "飲料", 49);
List list = new ArrayList();
list.add(pd1);
list.add(pd2);
list.add(pd3);
System.out.println("*************** 商品信息 ***************");
for (int i = 0; i < list.size(); i++) {
System.out.println((Product) list.get(i));
}
}
}
```
【例題】下面的案例代碼演示了 subList() 方法的具體用法。
```
public static void main(String[] args) {
List list = new ArrayList();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
list.add("six");
list.add("seven");
System.out.println("list 集合中的元素數量:" + list.size());
System.out.println("list 集合中的元素如下:");
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next() + "、");
}
List sublist = new ArrayList();
// 從list集合中截取索引2~5的元素,保存到sublist集合中
sublist = list.subList(2, 5);
System.out.println("\nsublist 集合中元素數量:" + sublist.size());
System.out.println("sublist 集合中的元素如下:");
it = sublist.iterator();
while (it.hasNext()) {
System.out.print(it.next() + "、");
}
}
```
### 3.2 LinkList 類
LinkedList 類采用鏈表結構保存對象,這種結構的優點是便于向集合中插入或者刪除元素。需要頻繁向集合中插入和刪除元素時,使用 LinkedList 類比 ArrayList 類效果高,但是 LinkedList 類隨機訪問元素的速度則相對較慢。這里的隨機訪問是指檢索集合中特定索引位置的元素。
| 方法名稱 | 說明 |
| --- | --- |
| void addFirst(E e) | 將指定元素添加到此集合的開頭 |
| void addLast(E e) | 將指定元素添加到此集合的末尾 |
| E getFirst() | 返回此集合的第一個元素 |
| E getLast() | 返回此集合的最后一個元素 |
| E removeFirst() | 刪除此集合中的第一個元素 |
| E removeLast() | 刪除此集合中的最后一個元素 |
【例題】在倉庫管理系統中要記錄入庫的商品名稱,并且需要輸出第一個錄入的商品名稱和最后—個商品名稱。
```
public static void main(String[] args) {
LinkedList<String> products = new LinkedList<String>(); // 創建集合對象
String p1 = new String("六角螺母");
String p2 = new String("10A 電纜線");
String p3 = new String("5M 卷尺");
String p4 = new String("4CM 原木方板");
products.add(p1); // 將 p1 對象添加到 LinkedList 集合中
products.add(p2); // 將 p2 對象添加到 LinkedList 集合中
products.add(p3); // 將 p3 對象添加到 LinkedList 集合中
products.add(p4); // 將 p4 對象添加到 LinkedList 集合中
String p5 = new String("標準文件夾小柜");
products.addLast(p5); // 向集合的末尾添加p5對象
System.out.print("*************** 商品信息 ***************");
System.out.println("\n目前商品有:");
for (int i = 0; i < products.size(); i++) {
System.out.print(products.get(i) + "\t");
}
System.out.println("\n第一個商品的名稱為:" + products.getFirst());
System.out.println("最后一個商品的名稱為:" + products.getLast());
products.removeLast(); // 刪除最后一個元素
System.out.println("刪除最后的元素,目前商品有:");
for (int i = 0; i < products.size(); i++) {
System.out.print(products.get(i) + "\t");
}
}
```
【選擇】已知 ArrayList 的對象是 list,以下哪個方法是判斷 ArrayList 中包含"dodoke"()(選擇一項)
```
A. list.contains("dodoke");
B. list.add("dodoke");
C. list.remove("dodoke");
D. list.get("dodoke");
```
【編程】使用集合 ArrayList 對字符串進行存儲和管理。效果圖如下:
```
列表中元素的個數為:6
第1個為語文
第2個為數學
第3個為英語
第4個為化學
第5個為物理
第6個為生物
```
```
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
// 用 ArrayList 存儲學科的名稱
// 輸出列表中元素的個數
// 遍歷輸出所有列表元素
}
}
```
【選擇】下列哪個方法可以獲取列表指定位置處的元素()(選擇一項)
```
A. add(E e) B. remove() C. size() D. get(int index)
```
【編程】定義一個員工信息類 Employee,使用 ArrayList 對員工信息進行添加和顯示。效果如下:
```
員工姓名 員工薪資
張三 5000.0
李四 5500.0
趙六 4000.0
```
```
import java.util.List;
import java.util.ArrayList;
public class EmployeeTest {
public static void main(String[] args) {
// 定義 ArrayList 對象
// 創建三個 Employee 類的對象
// 添加員工信息到 ArrayList 中
// 顯示員工的姓名和薪資
}
}
```
## 四、Set 集合
Set 集合也實現了 Collection 接口,它主要有兩個實現類:HashSet 類和 TreeSet類。Set 集合中的對象不按特定的方式排序,只是簡單地把對象加入集合,集合中不能包含重復的對象,并且最多只允許包含一個 null 元素。
### 4.1 HashSet 類
HashSet 類是按照哈希算法來存儲集合中的元素,使用哈希算法可以提高集合元素的存儲速度,當向 Set 集合中添加一個元素時,HashSet 會調用該元素的 hashCode() 方法,獲取其哈希碼,然后根據這個哈希碼計算出該元素在集合中的存儲位置。
#### HashSet 類的常用構造方法
* HashSet():構造一個新的空的 Set 集合。
* HashSet(Collection c):構造一個包含指定 Collection 集合元素的新 Set 集合。
```
HashSet hs = new HashSet(); // 調用無參的構造函數創建HashSet對象
HashSet<String> hss = new HashSet<String>(); // 創建泛型的 HashSet 集合對象
```
【例題】使用 HashSet 創建一個 Set 集合,并向該集合中添加 5 本圖書名稱。
```
public static void main(String[] args) {
HashSet<String> bookSet = new HashSet<String>(); // 創建一個空的 Set 集合
String book1 = new String("如何成為 Java 編程高手");
String book2 = new String("Java 程序設計一百例");
String book3 = new String("從零學 Java 語言");
String book4 = new String("論 java 的快速開發");
bookSet.add(book1); // 將 book1 存儲到 Set 集合中
bookSet.add(book2); // 將 book2 存儲到 Set 集合中
bookSet.add(book3); // 將 book3 存儲到 Set 集合中
bookSet.add(book4); // 將 book4 存儲到 Set 集合中
System.out.println("新進圖書有:");
Iterator<String> it = bookSet.iterator();
while (it.hasNext()) {
System.out.println("《" + (String) it.next() + "》"); // 輸出 Set 集合中的元素
}
System.out.println("共采購 " + bookSet.size() + " 本圖書!");
}
```
### 4.2 TreeSet 類
TreeSet 類同時實現了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以實現對集合進行自然排序,因此使用 TreeSet 類實現的 Set 接口默認情況下是自然排序的,這里的自然排序指的是升序排序。
TreeSet 只能對實現了 Comparable 接口的類對象進行排序,因為 Comparable 接口中有一個 compareTo(Object o) 方法用于比較兩個對象的大小。例如 a.compareTo(b),如果 a 和 b 相等,則該方法返回 0;如果 a 大于 b,則該方法返回大于 0 的值;如果 a 小于 b,則該方法返回小于 0 的值。
TreeSet 類除了實現 Collection 接口的所有方法之外,還提供了如下方法。
| 方法名稱 | 說明 |
| --- | --- |
| E first() | 返回集合中的第一個元素。E 表示集合中元素的數據類型 |
| E last() | 返回此集合中的最后一個元素 |
| E poolFirst() | 獲取并移除此集合中的第一個元素 |
| E poolLast() | 獲取并移除此集合中的最后一個元素 |
| SortedSet<E> subSet(E fromElement, E toElement) | 返回一個新的集合,新集合包含原集合中 fromElement 對象與?toElement對象之間的所有對象。包含 fromElement 對象,不包含 toElement 對象 |
| SortedSet<E> headSet(E toElement) | 返回一個新的集合,新集合包含原集合中 toElement 對象之前的所有對象。不包含 toElement 對象。 |
| SortedSet<E> tailSet(E fromElement) | 返回一個新的集合,新集合包含原集合中 fromElement 對象之后的所有對象。包含 fromElement 對象。 |
【例題】本次有 5 名學生參加考試,當老師錄入每名學生的成績后,程序將按照從低到高的排列順序顯示學生成績。此外,老師可以查詢本次考試是否有滿分的學生存在,不及格的成績有哪些,90 分以上成績的學生有幾名。
```
public static void main(String[] args) {
TreeSet<Double> scores = new TreeSet<Double>(); // 創建 TreeSet 集合
Scanner input = new Scanner(System.in);
System.out.println("------------學生成績管理系統-------------");
for (int i = 0; i < 5; i++) {
System.out.println("第" + (i + 1) + "個學生成績:");
double score = input.nextDouble(); // 將學生成績轉換為Double類型,添加到TreeSet集合中
scores.add(Double.valueOf(score));
}
Iterator<Double> it = scores.iterator(); // 創建 Iterator 對象
System.out.println("學生成績從低到高的排序為:");
while (it.hasNext()) {
System.out.print(it.next() + "\t");
}
System.out.println("\n請輸入要查詢的成績:");
double searchScore = input.nextDouble();
if (scores.contains(searchScore)) {
System.out.println("成績為: " + searchScore + " 的學生存在!");
} else {
System.out.println("成績為: " + searchScore + " 的學生不存在!");
}
// 查詢不及格的學生成績
SortedSet<Double> score1 = scores.headSet(60.0);
System.out.println("\n不及格的成績有:");
for (int i = 0; i < score1.toArray().length; i++) {
System.out.print(score1.toArray()[i] + "\t");
}
// 查詢90分以上的學生成績
SortedSet<Double> score2 = scores.tailSet(90.0);
System.out.println("\n90 分以上的成績有:");
for (int i = 0; i < score2.toArray().length; i++) {
System.out.print(score2.toArray()[i] + "\t");
}
}
```
【選擇】下列有關 HashSet 的描述正確的是()(選擇兩項)
```
A. HashSet 是 Set 的一個重要實現類
B. HashSet 中的元素無序但可以重復
C. HashSet 中只允許一個 null 元素
D. 不適用于存取和查找
```
【選擇】以下關于 Set 對象和創建錯誤的是()(選擇一項)
```
A. Set set = new Set();
B. Set set = new HashSet();
C. HashSet set = new HashSet();
D. Set set = new HashSet(10);
```
【選擇】關于 Iterator 的描述錯誤的是()(選擇一項)
```
A. Iterator 可以對集合 Set 中的元素進行遍歷
B. hasNext() 方法用于檢查集合中是否還有下一個元素
C. next() 方法返回集合中的下一個元素
D. next() 方法的返回值為 false 時,表示集合中的元素已經遍歷完畢
```
【選擇】定義一個 Worker 類,關于 hashCode() 方法的說法正確的是()(選擇一項)
```
A. 在 Worker 類中,hashCode() 方法必須被重寫
B. 如果 hashCode 的值相同,則兩個 Worker 類的對象就認為是相等的
C. hashCode 的值不同時,則兩個對象必定不同
D. 以上說法均正確
```
【編程】定義一個學生類,使用 HashSet 對學生類的對象進行管理:執行添加操作,然后解決重復數據的添加問題。
```
[學號:3,姓名:張三,成績:65.0]
[學號:1,姓名:李四,成績:87.0]
[學號:2,姓名:王五,成績:95.0]
```
【選擇】下列相關迭代器描述不正確的是()(選擇一項)
```
A. Iterator 接口可以以統一的方式對各種集合元素進行遍歷
B. hashNext() 是 Iterator 接口的一個方法,是用來檢測集合中是否還有下一個元素
C. next() 是 Iterator 接口的一個方法,是用來返回集合中的下一個元素
D. hasNext() 是 Iterator 接口的一個方法,是用來返回集合中的下一個元素
```
【選擇】以下關于 Set 和 List 的說法正確的是()(選擇一項)
```
A. Set 中的元素是可以重復的
B. List 中的元素是無序的
C. HashSet 中只允許有一個 null 元素
D. List 中的元素是不可以重復的
```
## 五、Map 集合
Map 是一種鍵-值對(key-value)集合,Map 集合中的每一個元素都包含一個鍵對象和一個值對象。其中,鍵對象不允許重復,而值對象可以重復,并且值對象還可以是 Map 類型的,就像數組中的元素還可以是數組一樣。
Map 接口主要有兩個實現類:HashMap 類和 TreeMap 類。其中,HashMap 類按哈希算法來存取鍵對象,而 TreeMap 類可以對鍵對象進行排序。
Map接口的常用方法
| 方法名稱 | 說明 |
| --- | --- |
| V get(Object key) | 返回 Map 中指定鍵對象所對應的值。V 表示值的數據類型 |
| V put(K key, V value) | 向 Map 中添加鍵-值對,返回 key 以前對應的 value,如果沒有, 則返回 null。 |
| V remove(Object key) | 從 Map 中刪除 key 對應的鍵-值對,返回 key 對應的 value,如果沒有,則返回null。 |
| Set entrySet() | 返回 Map 中所有鍵-值對的 Set 集合,此 Set 集合中元素的數據類型為 Map.Entry。 |
| Set keySet() | 返回 Map 中所有鍵對象的 Set 集合。 |
【例題】每名學生都有屬于自己的唯一編號,即學號。在畢業時需要將該學生的信息從系統中移除。
```
public static void main(String[] args) {
HashMap users = new HashMap();
// 將學生信息鍵值對存儲到 Map 中
users.put("11", "張浩太");
users.put("22", "劉思誠");
users.put("33", "王強文");
users.put("44", "李國量");
users.put("55", "王路路");
System.out.println("******** 學生列表 ********");
Iterator it = users.keySet().iterator();
// 遍歷 Map
while (it.hasNext()) {
Object key = it.next();
Object val = users.get(key);
System.out.println("學號:" + key + ",姓名:" + val);
}
Scanner input = new Scanner(System.in);
System.out.println("請輸入要刪除的學號:");
int num = input.nextInt();
if (users.containsKey(String.valueOf(num))) { // 判斷是否包含指定鍵
users.remove(String.valueOf(num)); // 如果包含就刪除
} else {
System.out.println("該學生不存在!");
}
System.out.println("******** 學生列表 ********");
it = users.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
Object val = users.get(key);
System.out.println("學號:" + key + ",姓名:" + val);
}
}
```
【選擇】HashMap 的數據是以 key-value 的形式存儲的,以下關于 HashMap 的說法正確的是()(選擇一項)
```
A. HashMap 中的鍵不能為 null
B. HashMap 中的 Entry 對象是有序排列的
C. key 值不允許重復
D. value 值不允許重復
```
【編程】已知數據,世界杯冠軍及奪冠年份:德國(2014)、西班牙(2010)、意大利(2006)、巴西(2002)、法國(1998),將奪冠年份作為 key 值,冠軍隊名作為 value 值,存儲至少三條數據到 HashMap 中,并循環打印輸出如下:
```
使用迭代器方法進行輸出:
意大利 德國 西班牙
使用 EntrySet 進行輸出:
2006-意大利
2014-德國
2010-西班牙
```
```
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class FootballTest {
public static void main(String[] args) {
// 定義 HashMap 的對象并添加數據
// 使用迭代器的方式遍歷
// 使用 EntrySet 同時獲取 key 和 value
}
}
```
【選擇】已知 HashMap 對象,空白處應添加的語句是()(選擇一項)
```
Map<String, String> hashMap = new HashMap<>();
hashMap.put("1", "stu01");
hashMap.put("2", "stu02");
Set<String> keySet = hashMap.keySet();
for (String key : keySet) {
// 根據 key 值輸出 value 的值
System.out.println( );
}
```
```
A. hashMap.get(key);
B. hashMap.getValue();
C. hashMap.getKey();
D. hashMap.Value();
```
- 階段一 Java 零基礎入門
- 步驟1:基礎語法
- 第01課 初識
- 第02課 常量與變量
- 第03課 運算符
- 第04課 選擇結構
- 第05課 循環結構
- 第06課 一維數組
- 第08課 方法
- 第09課 數組移位與統計
- 第10課 基礎語法測試
- 第09課 基礎語法測試(含答案)
- 步驟2:面向對象
- 第01課 類和對象
- 第02課 封裝
- 第03課 學生信息管理
- 第04課 繼承
- 第05課 單例模式
- 第06課 多態
- 第07課 抽象類
- 第08課 接口
- 第09課 內部類
- 第10課 面向對象測試
- 第10課 面向對象測試(含答案)
- 步驟3:常用工具類
- 第01課 異常
- 第02課 包裝類
- 第03課 字符串
- 第04課 集合
- 第05課 集合排序
- 第06課 泛型
- 第07課 多線程
- 第08課 輸入輸出流
- 第09課 案例:播放器
- 第10課 常用工具測試(一)
- 第10課 常用工具測試(一)(答案)
- 第10課 常用工具測試(二)
- 第10課 常用工具測試(二)(答案)
- 階段二 從網頁搭建入門 JavaWeb
- 步驟1:HTML 與 CSS
- 第01課 HTML 入門
- 第01課 HTML 入門(作業)
- 第02課 CSS 入門
- 第02課 CSS 入門(作業)
- 第03課 CSS 布局
- 第03課 CSS 布局(作業)
- 步驟2:JavaScript 與前端案例
- 第01課 JavaScript 入門
- 第01課 JavaScript 入門(作業)
- 第02課 仿計算器
- 第03課 前端油畫商城案例
- 第04課 輪播圖
- 第05課 網頁搭建測試
- 第05課 網頁搭建測試(含答案)
- 步驟3:JavaScript 教程
- 入門
- 概述
- 基本語法
- 數據類型
- 概述
- 數值
- 字符串
- undefined, null 和布爾值
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 位運算符
- 運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 標準庫
- String
- Date
- Math
- DOM
- 概述
- Document 節點
- 事件
- EventTarget 接口
- 事件模型
- 常見事件
- 階段三 數據庫開發與實戰
- 步驟1:初始數據庫操作
- 第01課 數據類型
- 第02課 表的管理
- 第03課 數據管理
- 第04課 常用函數
- 第05課 JDBC 入門
- 第06課 Java 反射
- 第07課 油畫商城
- 第08課 數據庫基礎測試
- 步驟2:MyBatis 從入門到進階
- 第01課 IntelliJ IDEA 開發工具入門
- 第02課 Maven 入門
- 第03課 工廠模式
- 第04課 MyBatis 入門
- 第05課 MyBatis 進階
- 第06課 商品信息管理
- 第07課 MyBatis 基礎測試
- 步驟3:Redis 數據庫與 Linux 下項目部署
- 第01課 Linux 基礎
- 第02課 Linux 下 JDK 環境搭建及項目部署
- 第03課 Redis 入門
- 階段四 SSM 到 Spring Boot 入門與綜合實戰
- 步驟1:Spring 從入門到進階
- 第01課 Spring 入門
- 第02課 Spring Bean 管理
- 第03課 Spring AOP
- 第04課 基于 AspectJ 的 AOP 開發
- 第05課 JDBC Template
- 第06課 Spring 事務管理
- 第07課 人員管理系統開發
- 第08課 Spring 從入門到進階測試
- 步驟2:Spring MVC 入門與 SSM 整合開發
- 第01課 Spring MVC 入門與數據綁定
- 第02課 Restful 風格的應用
- 第03課 SpringMVC 攔截器
- 第04課 辦公系統核心模塊
- 步驟3:Spring Boot 實戰
- 第01課 Spring Boot 入門
- 第02課 校園商鋪項目準備
- 第03課 校園商鋪店鋪管理
- 第04課 校園商鋪商品管理及前臺展示
- 第05課 校園商鋪框架大換血
- 步驟4:Java 面試
- 第01課 面試準備
- 第02課 基礎面試技巧
- 第03課 Web基礎與數據處理
- 第04課 主流框架