1. 集合的基本概念
Collection List Set Map都是接口,实例化要通过子类来实现,List接口常用的子类是ArrayList,Set接口常用的子类是HashSet,Map接口常用的子类是HashMap
2. List集合
使用集合的步骤:
- 创建集合对象
- 创建元素对象
- 将元素对象添加到集合对象中
- 遍历集合
ArrayList常用方法:添加元素的add方法,获取长度的size方法,获取元素的get方法
List集合的特点:可重复、有序(存取顺序相同)
package cn.case5;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 创建元素对象
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循环遍历,快捷键iter+Enter
for (Object obj : list) {
System.out.println(obj);
}
}
}
}
3. 增强for循环
格式:
for (元素的数据类型 变量名 : 要遍历的数组或集合对象) {
// 循环体
}
增强for循环依赖的是迭代器
4. 迭代器
普通的迭代器在遍历过程中不能添加或删除元素,否则会报:并发修改异常
列表迭代器在遍历集合的同时可以修改集合中的元素(添加、删除等),必须使用列表迭代器的方法
迭代器的使用步骤:
- 根据集合对象获取对象的迭代器对象
- 判断迭代器中是否有元素
- 如果有就获取元素
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. 泛型
泛型一般只和集合类相结合使用
泛型是JDK5的新特性,但是从JDK7开始,后边的泛型可以不用写具体的数据类型(菱形泛型)
6. Collections工具类
该类的方法大多是静态类,可以通过类名直接访问
7. Set集合
Set集合的特点:不可重复、无序
Set集合保证元素的唯一性,依赖:equals()和hashCode()方法
8. Map集合
put(key k, value v)方法:添加元素(键值对的形式);元素第一次添加,返回null;重复添加会用新值覆盖旧值,并返回旧值
Map中键不可以重复,值可以重复
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个学生对象,然后打印
// 1.创建集合对象
Map map = new HashMap<>();
// 2.创建元素对象
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}}
// 根据键获取值
Student stu = map.get(1);
System.out.println("student:" + stu); // student:Student{name='张三', age=23}
// 遍历map集合
// 1. 遍历所有的键集合KeySet()
Set keys = map.keySet();
// // 2. 遍历所有的键,获取每一个键值 迭代器,增强for
// Iterator 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. 模拟斗地主发牌
package cn.case6;
import java.util.*;
public class Test {
public static void main(String[] args) {
// 1. 买一副牌
// 双列集合,存储编号和牌
Map pukers = new HashMap<>();
// 单列集合,存储编号
List nums = new ArrayList<>();
// 创建一副牌
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.发牌
// 创建4个集合来表示3个玩家和底牌
List player1 = new ArrayList<>();
List player2 = new ArrayList<>();
List player3 = new ArrayList<>();
List 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 nums, Map map) {
// 对牌的编号进行升序排列
Collections.sort(nums);
StringBuilder sb = new StringBuilder();
// 遍历牌的编号
for (Integer num : nums) {
// 根据编号找到对应的牌
String puker = map.get(num);
sb.append(puker + " ");
}
// 返回最后的结果
String str = sb.toString();
return str.trim();
}
}
运行结果如下: