# 集合框架
## 什么是集合
Java中的集合是工具類,可以存儲任意數量的具有共同屬性的對象。
> 集合類存放于java.util包中。
> 集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用
> 在集合框架中,主要分為 Collection 和 Map 兩大接口。
> 在 Collection 中又分為 List (有序集合) 和 Set (無序集合)。List 和 Set 都是接口。
> 其中Collection存儲的是元素,Map存儲的key-value鍵值對。
> 集合框架存儲的元素可以是不定長的,即可以任意的添加,但是數組在定義的時候就確定了長度。實際開發中,對于同類型數據的結構,一般使用 Collection 結構會較多。
## Collection

在Collection中,根據不同的數據結構是使用方法,分為Set(無序的數據集合,元素不可重復)、Queue(隊列)、List(有序的集合,元素可以重復)。
在Collection中的定義中Interface Collection,是一種泛型結構,意思是在使用Collection定義對象的時候,需要指定存儲的元素數據類型(強調:**在集合中存儲的數據元素必須都是引用數據類型**)。
### List
list中的內容是有序的并且可以重復的,我們也稱之為序列;
list可以精確的控制每個元素的插入位置,或者刪除某個位置的元素;
> 是實際開發中用的最多的一種數據結構,存儲的單個元素,使用**泛型**去強制約束 List 中存放的是一致的數據類型
> 在List接口中,最常用的實現類為ArrayList和LinkedList,其中ArrayList是運用最多的。
**語法**
~~~
List<E> list = new ArrayList<E>();
~~~
**插入元素**
add()
**遍歷元素**
* 通過元素索引下標方式 for 循環
* 通過 foreach 循環
* 通過迭代器 Iterator
**刪除元素**
如果通過遍歷去查找相關元素進行刪除的時候,不要使用 list.remove(int index) 該方法,因為使用該方法,會動態的直接改變集合的元素結構,導致遍歷的不完整或者有錯誤。要使用迭代器遍歷集合,調用 Iterator.remove() 方法刪除。
### Set
不詳細闡述,在遍歷的時候不能使用索引方式,只能通過迭代器和 foreach。
## Map

類似的可以理解給集合元素中的值定義了一個 Key 鍵(遍歷),之后可以通過相關的方法快速的定位到具體的 Value 中。
Map中存儲是key-value鍵值對,在Map接口中,我們主要使用的實現類為HashMap。
在使用HashMap類的時候,插入的順序和最后遍歷出來的順序可以是有差異的,因為本身HashMap結構它是無序的。
通過map.put(key, value)方法進去數據的寫入,同樣的要注意使用泛型。(強調:**Map中的key鍵和value值的數據元素必須都是引用數據類型**)。
* * *
**語法**
~~~
Map<k,v> map= new HashMap<k,v>();
~~~
**獲取某個 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 的添加元素、遍歷元素。
要認識集合框架中關于對象在內存中的存儲方法。
## 本節課的代碼片段
~~~java
public class Students {
private String name;
private String code;
public Students() {
}
public Students(String code, String name) {
this.code = code;
this.name = name;
}
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;
}
@Override
public String toString() {
return "Students [name=" + this.getName() + ", code=" + this.getCode() + "]";
}
}
public class Demo {
public static void main(String[] args) {
Students qdd = new Students("001","仇冬冬");
Students drm = new Students("002","丁潤萌");
Clazz amateur = new Clazz();
amateur.setCode("j01");
amateur.setName("JAVA業余班");
List<Students> stu = new ArrayList<Students>();
//list中使用add()方法,來添加元素
stu.add(qdd);
stu.add(drm);
//當我們想要在list集合中追加元素的時候,同樣使用add()方法
Students qh = new Students("003","邱晗");
stu.add(qh);
/*for(int i = 0; i < stu.size(); i++) {
//list集合中,通過索引的方式,來查找集合中的元素get()
System.out.println(stu.get(i));
}
System.out.println("************");
//通過size()方法查看集合的大小
System.out.println(stu.size());
//所以 list集合中索引的范圍是0~size-1;
//這是錯誤的,因為我們的索引超過了,索引的范圍
//stu.get(3);
//通過傳入索引來刪除索引對應的元素
stu.remove(0);
for(int i = 0; i < stu.size(); i++) {
System.out.println(stu.get(i));
}
//通過傳入對象來刪除集合中對應的對象
//stu.remove(qdd);
//for循環查詢list中的元素
for(int i = 0; i < stu.size(); i++) {
System.out.println(stu.get(i));
}
System.out.println("-------------------------");
//使用foreach() 查詢list中的元素
for(Students st : stu) {
System.out.println(st);
}
System.out.println("-------------------------");
//創建迭代器
Iterator<Students> it = stu.iterator();
while(it.hasNext()) {
//student對象就是我們遍歷出來的集合的對象
Students student = it.next();
System.out.println(student);
}*/
//集合中元素的修改
for(int i = 0; i < stu.size(); i++) {
Students student = stu.get(i);
String name = student.getName();
if(name.equals("邱晗")) {
student.setCode("070");
}
}
for(Students st : stu) {
System.out.println(st);
}
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//如何在list集合中進行循環刪除
/*for(int i = 0; i < stu.size(); i++) {
Students student = stu.get(i);
System.out.println(student.getName());
String name = student.getName();
if(name.equals("丁潤萌")) {
stu.remove(i);//這樣的實現是有問題的
System.out.println(stu.size());
}
}
for(Students st : stu) {
System.out.println(st);
}*/
//使用迭代器進行迭代器中的遍歷刪除
Iterator<Students> it = stu.iterator();
while(it.hasNext()) {
//student對象就是我們遍歷出來的集合的對象
Students student = it.next();
String name = student.getName();
if(name.equals("丁潤萌")) {
it.remove();
}
}
System.out.println("處理完的結果————————————————————");
Iterator<Students> it2 = stu.iterator();
while(it2.hasNext()) {
Students st = it2.next();
System.out.println(st);
}
}
}
~~~
~~~
public class Demo {
public static void main(String[] args) {
Students qdd = new Students("001","仇冬冬");
Students drm = new Students("002","丁潤萌");
Students lzj = new Students("003","劉子杰");
//map集合中添加元素的方式
Map<String,Students> map = new HashMap<String,Students>();
map.put("qdd", qdd);
map.put("drm", drm);
map.put("lzj", lzj);
//map集合中元素的查找
System.out.println(map.get("qdd"));
System.out.println("***************");
//針對map集合中元素的修改
Students stu = map.get("qdd");
stu.setCode("007");
//遍歷map集合
//第一步:獲取map中的key集合;
Set<String> set = map.keySet();
//第二部:迭代key集合
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(key);
Students st = map.get(key);
System.out.println(st);
}
Students wc = new Students("004","王晨");
map.put("wc", wc);
//刪除元素
map.remove("wc");
//這樣是錯誤的
/*Iterator<String> it1 = set.iterator();
while(it1.hasNext()) {
String key = it1.next();
if(key.equals("wc")) {
map.remove(key);
}
}
System.out.println(map);*/
}
}
~~~
## 練習
定義一個方法listTest(List\<Integer> al, Interger s),要求返回s在al里面第一次出現的索引,如果s沒有出現返回-1
~~~java
public class Demo {
public static int listTest(List<Integer> al, Integer s) {
/*int result = al.indexOf(s);
return result;*/
for(int i = 0; i < al.size(); i++) {
//al.get(i) == s
if(al.get(i).equals(s)) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(6);
list.add(2);
list.add(4);
list.add(5);
list.add(1);
list.add(4);
int a = listTest(list,4);
System.out.println(a);
}
}
~~~
現有一個map集合,如下:
~~~
Map<String,String> map = new HashMap<String,String>();
map.put("001","仇冬冬");
map.put("002","丁潤萌");
map.put("003","劉子杰");
map.put("004","邱晗");
~~~
要求:
1. 遍歷集合,并將人名與學號對應的打印出來
2. 向該集合插入一條學號為“005”的王晨的信息
3. 要去移除該map中仇冬冬的信息
4. 將map集合中學號為002的學生姓名改為小丁
~~~
Map<String,String> map = new HashMap<String,String>();
map.put("001","仇冬冬");
map.put("002","丁潤萌");
map.put("003","劉子杰");
map.put("004","邱晗");
map.put("005", "王晨");
map.remove("001");
map.put("002", "小丁");
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println("學號:" + key + " 姓名:" + map.get(key));
}
~~~
有兩個數組,第一個數組內容為:【黑龍江省,浙江省,江西省,廣東省,福建省】,第二個數組的內容為:【哈爾濱,杭州,南昌,廣州,福州】,將第一個數組元素作為key,第二個數組的元素作為value存儲到Map集合中,如【黑龍江=哈爾濱,浙江省=杭州】
~~~
String[] province = {"黑龍江省","浙江省","江西省","廣東省","福建省"};
String[] city = {"哈爾濱","杭州","南昌","廣州","福州"};
Map<String,String> map = new HashMap<String,String>();
for(int i = 0; i < province.length; i++) {
map.put(province[i],city[i]);
}
System.out.println(map);
~~~
~~~
List<String> province = new ArrayList<String>();
province.add("黑龍江省");
province.add("福建省");
province.add("浙江省");
province.add("廣東省");
province.add("江西省");
List<String> city = new ArrayList<String>();
city.add("杭州");
city.add("哈爾濱");
city.add("廣州");
city.add("福州");
city.add("南昌");
Map<String,String> map = new HashMap<String,String>();
for(int i = 0; i < province.size(); i++) {
String pro = province.get(i);
for(int j = 0; j < city.size(); j++) {
String ci = city.get(j);
if("黑龍江省".equals(pro)) {
if("哈爾濱".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("福建省".equals(pro)) {
if("福州".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("浙江省".equals(pro)) {
if("杭州".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("廣東省".equals(pro)) {
if("廣州".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("江西省".equals(pro)) {
if("南昌".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
}
}
}
System.out.println(map);
~~~
- Java業余班教學管理
- JAVA基礎
- JAVA開發學習準備
- JAVA介紹
- 開發JAVA的準備
- JAVA的運行原理
- JDK配置
- 我的第一個JAVA程序
- 類與對象
- 基礎語言要素
- 數據類型
- Eclipse的安裝與使用
- 變量
- 直接量
- 運算符
- 流程控制
- 數組結構
- 面向對象
- 隱藏與封裝
- 深入構造器
- 類的繼承
- 多態
- 包裝類
- final修飾符
- 抽象類
- 接口
- 設計模式
- 單例模式
- 工廠模式
- 集合框架
- 集合排序
- 常用類學習
- 異常處理
- Java基礎綜合練習
- JAVA高級
- 泛型
- 多線程
- 線程的創建
- 線程的生命周期
- 線程同步
- 線程通信
- 輸入輸出流(I/O編程)
- File文件操作
- 字節流與字符流
- 數據庫
- 數據庫介紹
- 數據庫安裝
- SQL
- 表的基本操作
- 修改數據語句
- 數據檢索操作
- 多表數據操作
- 表結構設計
- 綜合應用
- JavaWeb