# 集合框架
> 在集合框架中,主要分為 Collection 和 Map 兩大接口。
> 在 Collection 中又分為 List (有序集合) 和 Set (無序集合)。List 和 Set 都是接口。
> Map 存儲的 Key-Value 結構。
> 集合框架存儲的元素可以是不定長的,即可以任意的添加,但是數組在定義的時候就確定了長度。實際開發中,對于同類型數據的結構,一般使用 Collection 結構會較多。
## Collection
### List
> 是實際開發中用的最多的一種數據結構,存儲的單個元素,使用**泛型**去強制約束 List 中存放的是一致的數據類型
**插入元素**
add()
**遍歷元素**
- 通過元素索引下標方式 for 循環
- 通過 foreach 循環
- 通過迭代器 Iterator
**刪除元素**
如果通過遍歷去查找相關元素進行刪除的時候,不要使用 list.remove(int index) 該方法,因為使用該方法,會動態的直接改變集合的元素結構,導致遍歷的不完整或者有錯誤。要使用迭代器遍歷集合,調用 Iterator.remove() 方法刪除。
### Set
不詳細闡述,在遍歷的時候不能使用索引方式,只能通過迭代器和 foreach。
## Map
類似的可以理解給集合元素中的值定義了一個 Key 鍵(遍歷),之后可以通過相關的方法快速的定位到具體的 Value 中。
**獲取某個 key 的 value**
Value get(Key)
**如何遍歷 Map 結構**
獲取 Map 的 Key 集合,通過遍歷 Key 集合,獲取 Value 值。
1. 獲取 key 集合:map.keySet();
2. 遍歷 Key 集合:iterator;
3. 獲取 Value 值:get(key);
## 開發注意事項
在實際開發中,List 一般使用 ArrayList 實現類去構建,Map 一般使用 HashMap 實現類去構建。
要掌握對于 List 和 Map 的添加元素、遍歷元素。
要認識集合框架中關于對象在內存中的存儲方法。
## 使用 Collecionts 工具類
**使用 Collections.sort(list) 進行排序**
1. 集合中的元素類要實現 Comparable 接口,重寫 compareTo 方法;
2. 調用 Collections.sort(list) 完成排序
## 本節課的代碼片段
**代碼運行內存圖**

Clazz.java
~~~
package com.ntqingniao.j96.bean;
import java.util.List;
public class Clazz {
private String name;
private String code;
private List<Student> students;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
~~~
Clazz2.java
~~~
package com.ntqingniao.j96.bean;
import java.util.Map;
public class Clazz2 {
private String name;
private String code;
private Map<String, Student> stus;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Map<String, Student> getStus() {
return stus;
}
public void setStus(Map<String, Student> stus) {
this.stus = stus;
}
}
~~~
Client.java
~~~
package com.ntqingniao.j96.bean;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Client {
public static void main(String[] args) {
Student pxj = new Student("彭賢君", "001");
Student hjn = new Student("黃佳男", "002");
Clazz j96 = new Clazz();
j96.setName("Java96班");
j96.setCode("java96");
// Step1:學生類型的集合定義完成了
List<Student> stus = new ArrayList<Student>();
// Step2: 添加數據
stus.add(pxj);
stus.add(hjn);
// Step3: 追加一個新的學生
Student ljn = new Student("陸佳楠", "003");
stus.add(ljn);
// Step4: 設置班級學生屬性
j96.setStudents(stus);
// for (int i = 0; i < j96.getStudents().size(); i++) {
// Student stu = j96.getStudents().get(i);
// if (stu.getName().equals("黃佳男")) {
// stu.setCode("004");
// }
// }
// for (int i = 0; i < j96.getStudents().size(); i++) {
// // 打印對象,如果沒有顯式的調用toString()方法,編譯器也會執行toString();
// System.out.println(j96.getStudents().get(i));
// }
//
// for (int i = 0; i < stus.size(); i++) {
// System.out.println(stus.get(i));
// }
//
// for (Student stu : stus) {
// System.out.println(stu);
// }
//
// for (Student stu : stus) {
// if (stu.getName().equals("黃佳男")) {
// stu.setCode("005");
// }
// }
// for (int i = 0; i < j96.getStudents().size(); i++) {
// Student stu = j96.getStudents().get(i);
// System.out.println(stu.getName());
// if (stu.getName().equals("彭賢君")) {
// j96.getStudents().remove(i); // 這樣的實現是有問題的
// System.out.println(j96.getStudents().size());
// }
// }
//
// for (Student stu : stus) {
// System.out.println(stu);
// }
// 使用迭代器遍歷
// Step1:創建迭代器
Iterator<Student> it = stus.iterator();
while (it.hasNext()) {
Student stu = it.next();
System.out.println(stu);
if (stu.getName().equals("黃佳男")) {
it.remove();
}
}
System.out.println("處理完的結果======================");
it = stus.iterator();
while (it.hasNext()) {
Student stu = it.next();
System.out.println(stu);
}
}
}
~~~
Client2.java
~~~
package com.ntqingniao.j96.bean;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Client2 {
public static void main(String[] args) {
Student pxj = new Student("彭賢君", "001");
Student hjn = new Student("黃佳男", "002");
Clazz2 j96 = new Clazz2();
j96.setName("Java96班");
j96.setCode("java96");
Map<String, Student> stus = new HashMap<String, Student>();
stus.put("001", pxj);
stus.put("002", hjn);
j96.setStus(stus);
Student stu = stus.get("001");
System.out.println(stu.getName());
System.out.println(stus.containsKey("003"));
// 遍歷Map
// 第一步:獲取Map中的Key集合
Set<String> keySet = stus.keySet();
// 第二步:迭代Key集合
Iterator<String> keyIt = keySet.iterator();
while (keyIt.hasNext()) {
String key = keyIt.next();
// 根據Key獲取Value
Student value = stus.get(key);
System.out.println(key + "=" + value);
}
}
}
~~~
Client3.java
~~~
package com.ntqingniao.j96.bean;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Client3 {
public static void main(String[] args) {
Student pxj = new Student("彭賢君", "10", 20);
Student hjn = new Student("黃佳男", "008",19);
Student liuxiaowei = new Student("劉曉衛", "002",22);
Student liuxiaowei2 = new Student("劉曉衛", "005",15);
Student liuxiaowei3 = new Student("劉曉衛", "001",25);
Student liuxiaowei4 = new Student("劉曉衛", "004",13);
List<Student> stus = new ArrayList<Student>();
stus.add(pxj);
stus.add(hjn);
stus.add(liuxiaowei);
stus.add(liuxiaowei2);
stus.add(liuxiaowei3);
stus.add(liuxiaowei4);
Collections.sort(stus);
for(Student stu : stus) {
System.out.println(stu);
}
}
}
~~~
Student.java
~~~
package com.ntqingniao.j96.bean;
public class Student implements Comparable<Student>{
private String name;
private String code;
private int age;
public Student(String name, String code) {
super();
this.name = name;
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, String code, int age) {
super();
this.name = name;
this.code = code;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", code=" + code + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
if (this.age > o.age) {
return 1;
} else if (this.age == o.age) {
return 0;
} else {
return -1;
}
}
}
~~~
**撲克牌實例程序**
> 由于出現花色特殊的字符,需要把Java文件的字符編碼定義為 UTF-8
Constants.java
~~~
package com.ntqingniao.j96.bean;
public class Constants {
public static String[] FOLLOWS = {"?","?","?","?"};
public static int[] NUMBERS = {2,3,4,5,6,7,8,9,10,11,12,13,14};
public static String[] NUMBERS_STR = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
}
~~~
Poker.java
~~~
package com.ntqingniao.j96.bean;
public class Poker {
private String follow;
private int number;
public int compare(Poker p1, Poker p2) {
return 0;
}
public Poker(String follow, int number) {
super();
this.follow = follow;
this.number = number;
}
public String getFollow() {
return follow;
}
public void setFollow(String follow) {
this.follow = follow;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
return this.getFollow() + Constants.NUMBERS_STR[this.getNumber()-2];
}
}
~~~
Client4.java
~~~
package com.ntqingniao.j96.bean;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Client4 {
public static void main(String[] args) {
List<Poker> pokers = new ArrayList<Poker>();
for (String follow : Constants.FOLLOWS) {
for (int number : Constants.NUMBERS) {
Poker poker = new Poker(follow, number);
pokers.add(poker);
}
}
int i = 0;
for (Poker poker : pokers) {
System.out.print(poker + " ");
i++;
if (i % 13 == 0) {
System.out.println();
}
}
System.out.println("==========洗牌==========");
for (int j = 0; j < 5; j++) {
System.out.println("===========第" + (j + 1) + "副牌==========");
Collections.shuffle(pokers);
i = 0;
for (Poker poker : pokers) {
System.out.print(poker + " ");
i++;
if (i % 13 == 0) {
System.out.println();
}
}
}
}
}
~~~
- 前言
- 計算機軟件概論
- HTML基礎
- Web原理和HTML簡介
- Web原理
- HTML概念
- HTML標簽
- 標簽
- HTML固定基本結構
- 第一個HTML頁面
- 工具的使用
- 標題
- <hr>和<p>標簽
- 路徑概念
- 超級鏈接
- 列表
- 表格
- 表單的設計與使用
- 表單域的原理
- 文本框和密碼框
- 單選框和復選框
- 下拉列表框
- 多行文本和上傳
- 提交按鈕和重置按鈕
- 為CODING COFFEE加入在線購買頁
- HTML5
- 定位服務
- CSS基礎
- CSS的基礎使用
- CSS簡介
- CSS樣式規則和加載方式
- 內聯元素和區塊元素介紹
- 選擇器
- 偽類
- CSS顏色
- 背景圖片
- 文本
- CSS列表
- DIV+CSS布局
- 盒子模型的邊距和邊框
- Display屬性
- 浮動和清除浮動
- 用Position屬性進行定位
- 專題:居中和對齊
- CSS新特性
- CSS3邊框
- 動畫
- JavaScript基礎
- Hello World!
- 語句和變量
- 一切皆對象
- 標識符、注釋和區塊
- 基本數據類型和引用數據類型
- 語句
- 條件語句
- 循環語句
- 數據類型
- typeof
- number
- 字符串
- 布爾類型
- 函數
- 數組
- 運算符
- 加法運算符
- 算術、賦值、比較運算符
- 布爾運算符
- DOM模型
- DOM和DOM節點
- 特征相關屬性
- 節點對象的方法
- Element對象
- Attribute對象
- Text節點和CSS操作
- 事件模型
- 標準庫
- Number對象
- String對象
- Array對象
- Date、Boolean和Math對象
- JSON對象
- 面向對象編程中的 this
- Web Storage
- 錯誤處理機制
- Error對象和try..catch語句
- javascript的原生錯誤類型
- BOM模型
- window對象
- 計時事件
- jQuery基礎
- 認識jQuery
- jQuery對象和DOM對象
- jQuery選擇器
- jQuery Dom操作
- 查找節點和創建節點
- 插入節點和刪除節點
- 復制節點和替換節點
- 包裹節點和屬性操作
- 樣式操作
- 設置和獲取HTML、文本和值
- 遍歷節點和CSS操作
- jQuery 事件和動畫
- 事件綁定與冒泡處理
- jQuery動畫
- jQuery 插件
- validate 插件
- jQuery與Ajax的應用
- Ajax簡介
- jquery中的Ajax
- Bootstrap基礎
- 起步
- 柵格系統
- 排版樣式
- 表格和按鈕
- 表單和圖片
- 輔助類和響應式工具
- 圖標菜單按鈕組件
- 輸入框和導航組件
- 路徑、分頁、標簽和徽章組件
- 巨幕、頁頭、縮略圖和警告框
- 進度、條媒體對象和Well組件
- 列表組和嵌入組件
- 數據庫
- 數據庫介紹
- MySQL的安裝
- SQL
- 表基本操作
- 修改數據語句
- 數據檢索操作
- 多表數據操作
- 表結構設計
- 綜合應用
- JAVA
- JAVA 介紹
- JAVA 運行原理
- JDK 配置
- 類和對象
- 數據類型
- 變量
- 直接量
- 運算符
- 流程控制
- 數組結構
- 面向對象
- 隱藏和封裝
- 深入構造器
- 類的繼承
- 多態
- 包裝類
- final 修飾符
- 抽象類
- 接口
- 集合框架
- 常用類學習
- 設計模式-單例模式
- 異常處理
- JDBC
- JSP&Servlet
- Web應用
- Tomcat
- JSP
- Scriptlet
- Page 指令
- 包含指令
- 跳轉指令
- 用戶注冊實例
- JSP練習
- 內置對象
- Servlet
- 過濾器
- Web分層思想
- EL表達式
- JSTL
- 分頁實現
- AJAX&JSON
- 開發步驟
- 路徑問題
- Log4j
- Java高級
- 文件操作
- 泛型
- 類加載機制和反射
- 注解 Annotation
- Mybatis框架
- 框架介紹
- Mybatis簡單實現
- 表基本操作
- 優化配置文件
- 表字段名與實體類屬性名不同的解決方案
- 一對一關聯
- 一對多關聯
- Spring框架
- Spring簡介
- IOC控制反轉
- AOP面向切面編程
- SpringMVC框架
- 教學管理
- 學員名錄
- 周測統計
- 2018-03-02
- 2018-03-13
- 2018-03-21
- 課堂作業
- 缺勤記錄
- 默寫記錄
- 班級備忘錄