1. 集合的基本概念
Collection List Set Map都是接口,實例化要通過子類來實現(xiàn),List接口常用的子類是ArrayList,Set接口常用的子類是HashSet,Map接口常用的子類是HashMap

image.png

image.png
2. List集合
使用集合的步驟:
- 創(chuàng)建集合對象
- 創(chuàng)建元素對象
- 將元素對象添加到集合對象中
- 遍歷集合
ArrayList常用方法:添加元素的add方法,獲取長度的size方法,獲取元素的get方法
List集合的特點:可重復(fù)、有序(存取順序相同)
package cn.case5;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
// 創(chuàng)建集合對象
List list = new ArrayList();
// 創(chuàng)建元素對象
Student s1 = new Student("xiaohong", 12);
Student s2 = new Student("xiaogong", 12);
Student s3 = new Student("xiaowang", 26);
Student s4 = new Student("xiaoliu", 32);
// 添加元素
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
System.out.println(list);
// 獲取索引為2的元素
Object obj1 = list.get(2);
System.out.println("集合的第2個元素為:" + obj1);
System.out.println("集合的長度為:" + list.size());
// 遍歷集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
System.out.println("----------------------------");
// 增強for循環(huán)遍歷,快捷鍵iter+Enter
for (Object obj : list) {
System.out.println(obj);
}
}
}
}
3. 增強for循環(huán)
格式:
for (元素的數(shù)據(jù)類型 變量名 : 要遍歷的數(shù)組或集合對象) {
// 循環(huán)體
}
增強for循環(huán)依賴的是迭代器
4. 迭代器
普通的迭代器在遍歷過程中不能添加或刪除元素,否則會報:并發(fā)修改異常
列表迭代器在遍歷集合的同時可以修改集合中的元素(添加、刪除等),必須使用列表迭代器的方法

image.png
迭代器的使用步驟:
- 根據(jù)集合對象獲取對象的迭代器對象
- 判斷迭代器中是否有元素
- 如果有就獲取元素
package cn.case5;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Test2 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
// Iterator it = list.iterator();
// while (it.hasNext()) {
// String s = (String)it.next();
// System.out.println(s);
// }
System.out.println("---------------------------");
// 判斷集合中是否有字符串“b",在后面加一個新的字符串”java“
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String s = (String)lit.next();
if ("b".equals(s)) { // 把字符串"b"寫在前面可以防止空指針異常(變量可能為null)
lit.add("java");
}
System.out.println(s);
}
System.out.println("改變后的集合: " + list);
}
}
5. 泛型
泛型一般只和集合類相結(jié)合使用
泛型是JDK5的新特性,但是從JDK7開始,后邊的泛型可以不用寫具體的數(shù)據(jù)類型(菱形泛型)

image.png
6. Collections工具類
該類的方法大多是靜態(tài)類,可以通過類名直接訪問

image.png
7. Set集合
Set集合的特點:不可重復(fù)、無序
Set集合保證元素的唯一性,依賴:equals()和hashCode()方法
8. Map集合
put(key k, value v)方法:添加元素(鍵值對的形式);元素第一次添加,返回null;重復(fù)添加會用新值覆蓋舊值,并返回舊值
Map中鍵不可以重復(fù),值可以重復(fù)

image.png
package cn.case5;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
// 需求:向Map集合添加3個學(xué)生對象,然后打印
// 1.創(chuàng)建集合對象
Map<Integer, Student> map = new HashMap<>();
// 2.創(chuàng)建元素對象
Student s1 = new Student("張三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("張三", 23);
// 3.向集合中添加元素
map.put(1, s1);
map.put(2, s2);
map.put(3, s3);
// 4.打印元素
System.out.println(map); // {1=Student{name='張三', age=23}, 2=Student{name='李四', age=24}, 3=Student{name='張三', age=23}}
// 根據(jù)鍵獲取值
Student stu = map.get(1);
System.out.println("student:" + stu); // student:Student{name='張三', age=23}
// 遍歷map集合
// 1. 遍歷所有的鍵集合KeySet()
Set<Integer> keys = map.keySet();
// // 2. 遍歷所有的鍵,獲取每一個鍵值 迭代器,增強for
// Iterator<Integer> it = keys.iterator();
// while (it.hasNext()) {
// Integer key = it.next();
// Student value = map.get(key);
// System.out.println("key: " + key + "->value: " + value);
// }
// 通過增強for遍歷
for (Integer key : keys) {
Student value = map.get(key);
System.out.println("key: " + key + "->value: " + value);
}
}
}
9. 模擬斗地主發(fā)牌
package cn.case6;
import java.util.*;
public class Test {
public static void main(String[] args) {
// 1. 買一副牌
// 雙列集合,存儲編號和牌
Map<Integer, String> pukers = new HashMap<>();
// 單列集合,存儲編號
List<Integer> nums = new ArrayList<>();
// 創(chuàng)建一副牌
Integer num = 0;
String[] colors = {"?", "?", "?", "?"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
for (String number : numbers) {
for (String color : colors) {
String puker = number + color;
// System.out.println(puker);
pukers.put(num, puker);
nums.add(num);
num++;
}
}
// 添加小王
pukers.put(num, "小王");
nums.add(num++);
// 添加大王
pukers.put(num, "大王");
nums.add(num);
System.out.println("所有的牌: " + pukers);
System.out.println("牌的編號: " + nums);
// 2.洗牌
Collections.shuffle(nums);
System.out.println("洗牌后牌的編號: " + nums);
// 3.發(fā)牌
// 創(chuàng)建4個集合來表示3個玩家和底牌
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
// 索引對3取余
for (int i = 0; i < nums.size(); i++) {
Integer pukerNum = nums.get(i);
if (i >= nums.size() - 3) {
dipai.add(pukerNum);
}
else if (i % 3 == 0) {
player1.add(pukerNum);
}
else if (i % 3 == 1) {
player2.add(pukerNum);
}
else if (i % 3 == 2) {
player3.add(pukerNum);
}
}
// System.out.println("player1: " + player1);
// System.out.println("player2: " + player2);
// System.out.println("player3: " + player3);
// System.out.println("dipai: " + dipai);
// 4.看牌
System.out.println("player1: " + printPuker(player1, pukers));
System.out.println("player2: " + printPuker(player2, pukers));
System.out.println("player3: " + printPuker(player3, pukers));
System.out.println("dipai: " + printPuker(dipai, pukers));
}
// 定義一個方法printPuker,用來看牌
public static String printPuker(List<Integer> nums, Map<Integer, String> map) {
// 對牌的編號進(jìn)行升序排列
Collections.sort(nums);
StringBuilder sb = new StringBuilder();
// 遍歷牌的編號
for (Integer num : nums) {
// 根據(jù)編號找到對應(yīng)的牌
String puker = map.get(num);
sb.append(puker + " ");
}
// 返回最后的結(jié)果
String str = sb.toString();
return str.trim();
}
}
運行結(jié)果如下:

image.png