集合
一.集合和数组的对比
1.数组长度是不可变的,集合长度是可以变的
2.数组可以存储基本数据类型和引用数据类型 集合只能存储引用数据类型(可以存储基本数据类型
的包装类)
二.集合体系结构
list和set集合:
list集合里面的元素可以重复,set不能存储重复的集合
二.案例:
使用集合存储字符串:a,b,b,c 遍历删除集合里面的b元素
分析:
使用ArrayList来进行存储,然后使用迭代器来进行遍历
代码:
package com.qf.lt.oop09;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
//创建一个集合,存储元素:a b b c ; 使用迭代器遍历,删除元素b
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
System.out.println(list);
//使用迭代器来进行遍历
Iterator<String> iter = list.iterator();
//使用while来进行遍历
while(iter.hasNext()){
//发现删除不干净,因为在删除第一个b元素的时候,集合的长度自动变化了,变短了,
// 所以删除连续相同的元素的时候删除不干净
//解决办法:使用迭代器的remove方法就可以删除干净
if ("b".equals(iter.next())){
//使用集合的移除方法,删除不干净
//list.remove(iter.next());
//使用迭代器的删除方法
iter.remove();
}
}
System.out.println(list);
}
}
结果:
使用集合的删除方法:
使用迭代器的删除方法:
注意点;单列集合可以直接使用迭代器,双列集合不能直接使用迭代器
三.小技巧:
//增强for循环的小技巧:集合名.for+回车 -->可以快速构造增强for循环
/* for (String s : list) {
}*/
四.集合三种循环使用场景
需要操作索引,使用普通for循环
如果在遍历过程里面需要删除元素,使用迭代器
仅仅是遍历集合的话使用增强for循环
五.案例:collection集合存储学生对象
step01 需求:创建一个collection集合来存储三个学生对象,然后使用遍历打印学生对象
step02 分析:
创建一个学生类,
创建collection集合对象
创建学生对象
把学生添加到集合里面
遍历集合(迭代器)
代码:
package com.qf.lt.oop10;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
//ArrayList集合的泛型是student
ArrayList<Student> list = new ArrayList<>();
Student stu1 = new Student("张三",12);
Student stu2 = new Student("李四",25);
Student stu3 = new Student("王五",19);
list.add(stu1);
list.add(stu2);
list.add(stu3);
//使用迭代器遍历
Iterator<Student> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("************************");
//使用增强for循环
for (Student st : list) {
System.out.println(st);
}
}
}
注意点:
package lq.lt.oop01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
//创建集合
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
// boolean add(Object obj) | 添加一个对象数据
method1(list1);
// boolean addAll(Collection c) | 将一个集合中的所有对象添加到此集合中
method2(list1, list2);
// void clear() | 清空此集合中的所有对象
method3(list2);
// boolean contains(Object o) | 检查此集合中是否包含o对象
method4(list1);
// boolean equals(Object o) | 比较此集合是否与指定对象相等
method5(list1);
// boolean isEmpty() | 判断此集合是否为空
method6(list1, list2);
// boolean remove(Object o) | 在此集合中移除o对象
method7(list1);
// int size() | 返回此集合中的元素个数
method8(list1);
// Object[] toArray() | 将此集合转换成数组
method9(list1);
}
private static void method9(Collection list1) {
Object[] ary = list1.toArray();
//注意数组不能直接打印,需要转换
System.out.println(Arrays.toString(ary));
}
private static void method8(Collection list1) {
System.out.println(list1.size());
}
private static void method7(Collection list1) {
list1.remove("bbb");
System.out.println(list1);
}
private static void method6(Collection list1, Collection list2) {
boolean flag = list2.isEmpty();
boolean flag1=list1.isEmpty();
System.out.println(flag);
System.out.println(flag1);
}
private static void method5(Collection list1) {
boolean flag = list1.equals("aaa");
boolean flag1 = list1.equals("aaa");
System.out.println(flag);
}
private static void method4(Collection list1) {
boolean flag=list1.contains("bbb");
boolean flag1=list1.contains("ddd");
System.out.println(flag);
System.out.println(flag1);
}
private static void method3(Collection list2) {
list2.clear();
System.out.println(list2);
}
private static void method2(Collection list1, Collection list2) {
list2.addAll(list1);
System.out.println(list2);
}
private static void method1(Collection list1) {
//添加元素
list1.add("aaa");
list1.add("bbb");
list1.add("cccc");
//打印集合
System.out.println(list1);
}
}
应用:
package lq.lt.oop01;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
//实例化集合
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
//void add(int index, Object o) | 在index位置插入对象o。
method1(list);
//boolean addAll(int index, Collection c) | 将一个集合中的元素添加到此集合中的index位置。
method2(list);
//Object get(int index) | 返回集合中指定位置的元素。
System.out.println(list.get(4));
//List subList(int fromIndex, int toIndex) | 返回fromIndex和toIndex之间的集合元素。
//注意:返回的还是一个集合,可以再使用一个集合来进行接受
method3(list);
}
private static void method3(List list) {
List li = list.subList(1, 6);
System.out.println(li);
//使用增强for循环遍历
for (Object obj : li) {
System.out.println(obj);
}
}
private static void method2(List list) {
List list1 = new ArrayList();
list1.add("1");
list1.add("2");
list1.add("3");
list.addAll(2,list1);
System.out.println(list);
}
private static void method1(List list) {
System.out.println(list);
list.add(1,"d");
System.out.println(list);
}
}
集合遍历:
package lq.lt.oop01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
List list = new ArrayList();
//集合来存储对象时
list.add(new Student("张三",12));
list.add(new Student("李四",5));
list.add(new Student("王五",22));
// System.out.println(list);
//使用普通for循环,需要把集合使用toString()方法转换成数组
method01(list);
System.out.println("*************************************");
//使用迭代器,如果集合存储的是对象,在遍历的时候需要将集合拿到的对象强制转换成对像类型
//需要拿到集合里面的数据,使用迭代器
method02(list);
System.out.println("*************************************");
//使用增强for循环,只是单纯的需要遍历,使用增强for循环遍历,
method03(list);
System.out.println(list.contains(new Student("张三",12)));
}
private static void method03(List list) {
for (Object obj : list) {
System.out.println(obj);
}
}
private static void method02(List list) {
Iterator iter = list.iterator();
while (iter.hasNext()){
Student stu = (Student)iter.next();
System.out.println(stu.toString());
//获取对象的属性
// System.out.println(stu.getName());
}
}
private static void method01(List list) {
Object[] arr = list.toArray();
for (int i =0;i<arr.length;i++){
//把数组强制转换成字符串
Student st = (Student)arr[i];
System.out.println(st);
}
}
}
七.LinkedList集合
package lq.lt.oop02;
import java.util.LinkedList;
public class Test01 {
public static void main(String[] args) {
//创建LinkedList集合
LinkedList list = new LinkedList();
list.add(new Student("张三",15));
list.add(new Student("李四",35));
list.add(new Student("王五",23));
System.out.println(list);
//使用普通for循环,集合转换为数组来进行遍历
method01(list);
System.out.println("***************************************************");
//使用for循环,直接遍历集合
method02(list);
}
private static void method02(LinkedList list) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
private static void method01(LinkedList list) {
Object[] obj = list.toArray();
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
}
}
八.ArrayList集合和LinkedList集合的区别:
九.泛型
1.概念:泛型是jdk1.5之后引入的一个新特性,其本质是参数化数据类型,把类型作为参数传递
2.类型:泛型类,泛型方法,泛型接口
3.语法:<T> 表示数据类型占位符,表示一种引用数据类型
4.优点:
A.提高代码的重用性
B.防止数据类型转换异常,提高代码安全性
5.特点:泛型只能是引用数据类型
十.Collections工具类
package lq.lt.oop04;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> iter = new LinkedList<>();
iter.add(10);
iter.add(30);
iter.add(40);
iter.add(260);
iter.add(50);
iter.add(42);
System.out.println("原数据:"+iter);
//public static void reverse(List<?> list) 反转集合中元素的顺序
Collections.reverse(iter);
System.out.println("反转集合:"+iter);
// public static void shuffle(List<?> list) 随机重置集合元素的顺序
Collections.shuffle(iter);
System.out.println("打乱顺序后的集合:"+iter);
// public static void sort(List<T> list) 升序排序(元素类型必须实现Comparable接口)
Collections.sort(iter);
System.out.println("升序后的集合:"+iter);
//public static <T> int binarySearch( list, T key) 二分查找 查找到元素的位置
Integer temp = Collections.binarySearch(iter,50);
System.out.println(temp);
}
}
十一.Set集合
1.HashSet集合
1.基于Hashcode实现元素不重复
package lq.lt.oop05;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test {
public static void main(String[] args) {
//Map集合
Map<String,String> map = new HashMap<>();
//Map集合赋值
map.put("张三","男");
map.put("李四","男");
map.put("赵六","女");
map.put("王二","男");
System.out.println("原始集合:"+map);
//boolean containsKey(Object key)集合中是否包含指定的key
System.out.println(map.containsKey("王二"));
//Set<Map.Entry<K,V>> entrySet()用于来遍历map集合
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> mapE : entrySet) {
System.out.println(mapE);
}
//V get(Object key)通过键获取值
System.out.println(map.get("赵六"));
//boolean isEmpty()判断集合是否为空
System.out.println(map.isEmpty());
//Set keySet()获取map集合中所有的key
Set<Map.Entry<String, String>> set = map.entrySet();
for (Map.Entry<String, String> stringStringEntry : set) {
System.out.println(stringStringEntry.getKey());
}
//Collection values()获取Map集合中所有的值
Set<Map.Entry<String, String>> set02 = map.entrySet();
for (Map.Entry<String, String> str : set) {
System.out.println(str.getValue());
}
//int size()获取集合的长度
System.out.println(map.size());
//V remove(Object key)根据key删除整个键值对
map.remove("李四");
System.out.println(map);
//V put(K key, V value)如果key不存在则执行添加,如果key存在则修改value
map.put("张三","女");
System.out.println(map);
//void clear()删除map集合中所有的元素
map.clear();
System.out.println(map.isEmpty());
}
}
2.HashMap的第一种遍历方式
package lq.lt.oop05;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test01 {
public static void main(String[] args) {
//Map集合
Map<String,String> map = new HashMap<>();
//Map集合赋值
map.put("张三","男");
map.put("李四","男");
map.put("赵六","女");
map.put("王二","男");
System.out.println("原始集合:"+map);
//使用增强for循环
method01(map);
System.out.println("*********************************************");
//使用迭代器循环
method02(map);
}
private static void method02(Map<String, String> map) {
Set<Map.Entry<String, String>> set02 = map.entrySet();
Iterator<Map.Entry<String, String>> iterator = set02.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
private static void method01(Map<String, String> map) {
Set<Map.Entry<String, String>> set = map.entrySet();
for (Map.Entry<String, String> entry : set) {
System.out.println(entry);
}
}
}
3.Hash Map的第二种遍历方式
package lq.lt.oop05;
import java.security.Key;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test02 {
public static void main(String[] args) {
//Map集合
Map<String,String> map = new HashMap<>();
//Map集合赋值
map.put("张三","男");
map.put("李四","男");
map.put("赵六","女");
map.put("王二","男");
System.out.println("原始集合:"+map);
//通过map.keyset来获取key值和value值
for (String s : map.keySet()) {
System.out.println(s+"\t"+map.get(s));
}
//遍历获取value值
for (String s1: map.values()){
System.out.println(s1);
}
}
}
十二.斗地主
step01 需求:
step02 分析:
step03 代码:
package lq.lt.oop05;
import java.util.*;
public class Test04 {
public static void main(String[] args) {
Map<Integer,String> map= new HashMap<>();
String[] colors = {"♦","♣","♥","♠"};
String[] nums={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//遍历生成52张牌
//使用一个数来代替索引
Integer temp = 1;
for (int i=0;i<nums.length;i++){
for (int j=0;j<colors.length;j++){
map.put(temp,colors[j]+nums[i]);
temp++;
}
}
//生成大小王
map.put(53,"小王");
map.put(54,"大王");
/*System.out.println(map);*/
//因为LinkedList集合可以重置集合的索引,所以使用这个集合来进行洗牌
List list=new LinkedList();
for (int i=1;i<55;i++){
list.add(i);
}
/*System.out.println(list);*/
//洗牌,使用集合的工具类的shuffle方法
Collections.shuffle(list);
/* System.out.println("洗牌后的集合:"+list);*/
List li01 = new ArrayList();
List li02 = new ArrayList();
List li03 = new ArrayList();
List li04 = new ArrayList();
//发牌
for(int i=0;i<list.size()-3;i++){
if (i%3==0){
li01.add(list.get(i));
}else if (i%3==1){
li02.add(list.get(i));
}else {
li03.add(list.get(i));
}
}
//拿取底牌
li04.add(list.get(51));
li04.add(list.get(52));
li04.add(list.get(53));
//打印牌的索引
Collections.sort(li01);
Collections.sort(li02);
Collections.sort(li03);
/*System.out.println("华仔:"+li01);
System.out.println("星仔:"+li02);
System.out.println("赌神:"+li03);
System.out.println("底牌:"+li04);*/
//根据索引看牌,定义一个看牌的方法
//华仔
System.out.print("华仔:");
lookBoard(map, li01);
//星仔
System.out.print("星仔:");
lookBoard(map, li02);
//赌神
System.out.print("赌神:");
lookBoard(map, li03);
//底牌
System.out.print("底牌:");
lookBoard(map,li04);
}
//看牌的方法
private static void lookBoard(Map<Integer, String> map, List l) {
//System.out.print("赌神:");
Object[] array3 = l.toArray();
for (int i=0;i<array3.length;i++){
System.out.print(map.get(array3[i])+"\t");
}
System.out.println();
}
}
总结:
1.使用collections集合的工具类升序:
collections.sort(集合名)
2.集合工具类的shuffle()方法可以打乱LindekList集合的里面元素的索引,所以需要使用这个集合来进行洗牌
collections.shuffle(集合名)
3.在看牌的时候,使用方法,这样可以避免重复看牌的代码