1.ArrayList

1.1回顾

  • 集合:存放多个数据类型或者是对象的容器

  • 持有的数据:
  • 单一数据—可以定义对应类型的变量直接持有
  • 多个数据—可以使用数组的方式记录,通过索引来访问数据
  • 在oop的基础上,可以使用集合的方式进行记录,常用ArrayList

  • 基本使用:
  • 1.创建集合对象
  • 2.向集合中添加数据
  • 3.从集合中获取元素/其他信息
方法声明 功能描述
boolean add(Object obj) 将指定元素obj追加到集合的末尾
Object get(int index) 返回集合中指定位置上的元素
int size() 返回集合中的元素个数
  1. package com.igeek_Collection.ArrayList.ArrayList_01;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-14:05
  5. */
  6. import java.sql.SQLOutput;
  7. import java.util.ArrayList;
  8. public class ArrayListDemo {
  9. public static void main(String[] args) {
  10. //创建集合对象
  11. ArrayList<Integer> list=new ArrayList<>();
  12. list.add(20);
  13. list.add(30);
  14. list.add(40);
  15. //从集合中获取元素
  16. Integer i= list.get(1);
  17. System.out.println(i);
  18. //获取长度
  19. Integer l=list.size();
  20. System.out.println(l);
  21. //遍历
  22. for (int j = 0; j < list.size() ; j++) {
  23. System.out.println(list.get(j));
  24. }
  25. }
  26. }

1.2 练习

  1. package com.igeek_Collection.ArrayList.ArrayList_02;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-14:32
  5. */
  6. import java.util.ArrayList;
  7. import java.util.Iterator;
  8. /**
  9. * 实现功能:
  10. *
  11. * 定义一个测试类,在测试类中定义一个集合,集合中存储3个数据--Person对象,这三个人的属性分别为
  12. * Jack 18
  13. * rose 16
  14. * aobama 60
  15. *
  16. * 最终遍历的集合,分别打印三个人的姓名,年龄
  17. * 并打印三个人的总年龄
  18. */
  19. public class ArrayListDemo {
  20. public static void main(String[] args) {
  21. //创建集合对象
  22. ArrayList<Person> list=new ArrayList<>();
  23. //添加对象
  24. list.add(new Person("Jack",18));
  25. list.add(new Person("Rose",16));
  26. list.add(new Person("AObama",60));
  27. // System.out.println(list);
  28. //调用Iterator方法,获取迭代器的对象
  29. Iterator<Person> iterator= list.iterator();
  30. //声明一个变量用来保存年龄
  31. int sum=0;
  32. //迭代集合
  33. while (iterator.hasNext()){//问
  34. //取
  35. Person p= iterator.next();
  36. System.out.println(p.getName()+":"+p.getAge());
  37. //年龄累加
  38. sum+=p.getAge();
  39. }
  40. System.out.println("三个人的总年龄是:"+sum);
  41. }
  42. }

2.Iterator—迭代器

迭代器的使用:

  • 迭代器:就是一个用来遍历数据的工具

  • 在java中不止ArrayList一种集合,java中提供了众多的集合

  • 不同的容器(集合),提供了不同的数据存储
  • 不同的集合特点不同,ArrayList是有序且可重复的集合
    *但是由于集合的不同,所以有些集合是没有下标的,就不可以使用get()方法来获取数据

  • 可以通过迭代器来处理:
  • 所有的集合通过获取元素的方法并不是唯一的,但是可以通过统一使用迭代器来处理

  • 迭代器:Iterator—接口

  • 利用迭代器进行遍历的时候需要以下几步:
  • 1.问—是否存在下一个元素
  • 2.取—把这个存在的下一个元素取出
  • 3.删—可以处理
  • Iterator接口的常用方法如下:

image.png
hasNext()方法:用来判断集合中是否有下一个元素可以迭代。如果返回true,说明可以迭代。
next()方法:用来返回迭代的下一个元素,并把指针向后移动一位。

  1. while (iterator.hasNext()){//问
  2. //取
  3. Integer thisNumber= iterator.next();
  4. System.out.println(thisNumber);
  5. }

  • 理解:
  • 在迭代器中其实有一个指针,通过指针来进行问取操作 ```java package com.igeek_Collection;

/**

  • @author Lynn
  • @create 2020-12-07-14:13 */

import java.util.ArrayList; import java.util.Iterator;

public class IteratorDemo { public static void main(String[] args) { ArrayList list=new ArrayList<>(); list.add(20); list.add(30); list.add(40); list.add(40);

  1. //利用迭代器来处理--import java.util.Iterator;
  2. //Iterator是一个接口,不能直接实例化,要通过集合去获取
  3. Iterator<Integer> iterator= list.iterator();
  4. //使用迭代器来遍历
  5. while (iterator.hasNext()){//问
  6. //取
  7. Integer thisNumber= iterator.next();
  8. System.out.println(thisNumber);
  9. }
  10. }

}

  1. <a name="lt8e5"></a>
  2. # 3.当前案例用于演示制造异常--这个异常在以后的操作中可能会出现
  3. ```java
  4. package com.igeek_Collection.ArrayList.ArrayList_03;
  5. /**
  6. * @author Lynn
  7. * @create 2020-12-07-14:58
  8. */
  9. import com.igeek_Collection.ArrayList.ArrayList_02.Person;
  10. import java.util.ArrayList;
  11. import java.util.Iterator;
  12. /**
  13. * 当前案例用于演示制造异常--这个异常在以后的操作中可能会出现
  14. *
  15. * 使用集合的存储多个对象的时候,当遇到16岁的人时就添加一个90岁的人
  16. * 该案例中,可能会出现并发修改异常,迭代器所认为的集合状态和集合真正的状态不统一,所以报错
  17. */
  18. public class CurrentModificationDemo {
  19. public static void main(String[] args) {
  20. //创建集合对象
  21. ArrayList<Person> list = new ArrayList<>();
  22. //添加对象
  23. list.add(new Person("Jack", 18));
  24. list.add(new Person("Rose", 16));
  25. list.add(new Person("AObama", 60));
  26. list.add(new Person("Lucy", 25));
  27. list.add(new Person("Tom", 30));
  28. list.add(new Person("Jerry", 90));
  29. //调用迭代器
  30. Iterator<Person> iterator = list.iterator();
  31. //制造异常--添加元素
  32. while (iterator.hasNext()) {
  33. Person p = iterator.next();
  34. System.out.println(p.getAge() + "岁的" + p.getName());
  35. //判断--年龄是不是为16岁
  36. if (p.getAge() == 16) {
  37. //存在则添加90岁的人
  38. list.add(new Person("Jerry", 90));
  39. }
  40. }
  41. }
  42. }

4.当前案例用于演示制造异常—这个异常在以后的操作中可能会出现—解决方案

  1. package com.igeek_Collection.ArrayList.ArrayList_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-14:58
  5. */
  6. import com.igeek_Collection.ArrayList.ArrayList_02.Person;
  7. import java.util.ArrayList;
  8. import java.util.Iterator;
  9. /**
  10. * 当前案例用于演示制造异常--这个异常在以后的操作中可能会出现--解决方案
  11. *
  12. * 使用集合的存储多个对象的时候,当遇到16岁的人时就添加一个90岁的人
  13. * 该案例中,可能会出现并发修改异常,迭代器所认为的集合状态和集合真正的状态不统一,所以报错
  14. */
  15. public class CurrentModificationDemo2 {
  16. public static void main(String[] args) {
  17. //创建集合对象
  18. ArrayList<Person> list = new ArrayList<>();
  19. //添加对象
  20. list.add(new Person("Jack", 18));
  21. list.add(new Person("Rose", 16));
  22. list.add(new Person("AObama", 60));
  23. list.add(new Person("Lucy", 25));
  24. list.add(new Person("Tom", 30));
  25. //调用迭代器
  26. Iterator<Person> iterator = list.iterator();
  27. //制造异常--添加元素
  28. while (iterator.hasNext()) {
  29. Person p = iterator.next();
  30. System.out.println(p.getAge() + "岁的" + p.getName());
  31. //判断--年龄是不是为16岁
  32. if (p.getAge() == 16) {
  33. //存在则添加90岁的人
  34. list.add(new Person("Jerry", 90));
  35. //1.当遇到16岁的人的时候,就退出当前操作
  36. break;
  37. }
  38. }
  39. //2.曲线救国--重新迭代集合中的数据--重新获取迭代器
  40. Iterator<Person> iterator2 = list.iterator();
  41. while (iterator2.hasNext()){
  42. //如果有就取出
  43. Person p2=iterator2.next();
  44. System.out.println(p2.getAge() + "岁的" + p2.getName());
  45. }
  46. }
  47. }

5.增强for循环

增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。
它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。

  1. package com.igeek_Collection.ForEach;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-15:22
  5. */
  6. import java.util.ArrayList;
  7. /**
  8. * 增强for循环:
  9. * 用来完成容器中获取元素的
  10. *
  11. * 格式:
  12. * for(容器内的类型 临时变量:容器的引用){
  13. * 内部可以直接使用临时变量来访问数据
  14. * }
  15. *
  16. * 注意:增强for循环的底层就是一个Iterator,因为迭代器在处理数据的时候有可能会出现并发修改的异常,
  17. * 所以增强for循环中就不进行数据的添加或者删除操作,只是用于查看数据
  18. *
  19. * 可以理解为是迭代器的一个实用展示
  20. */
  21. public class ForEachDemo {
  22. public static void main(String[] args) {
  23. //创建一个集合对象
  24. ArrayList<Integer> list=new ArrayList<>();
  25. list.add(10);
  26. list.add(100);
  27. list.add(1000);
  28. list.add(10000);
  29. //使用增强for循环遍历
  30. for(Integer thisNumber:list){
  31. System.out.println(thisNumber);
  32. }
  33. System.out.println("----------------------");
  34. //遍历字符串类型的数组
  35. String[] arr={"王嘉尔","王一博","卡卡西","猪猪侠"};
  36. for(String name:arr){
  37. System.out.println(name);
  38. }
  39. }
  40. }

6.类泛型使用的测试:

  1. package com.igeek_Collection.Izidingyifanxing;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-15:37
  5. */
  6. /**
  7. * 演示自定义泛型的使用--类使用类型
  8. *
  9. * 泛型是jdk5.0推出的新特性
  10. *
  11. * 在一个类中定义成员变量,使用泛型
  12. *
  13. * 不指定其数据类型,是一个不确定的数据类型
  14. * 创建不同对象的时候,指定不同的数据类型
  15. */
  16. public class MyClass<T> {
  17. //我的泛型字段
  18. private T myFiled;
  19. public MyClass() {
  20. }
  21. public MyClass(T myFiled) {
  22. this.myFiled = myFiled;
  23. }
  24. public T getMyFiled() {
  25. return myFiled;
  26. }
  27. public void setMyFiled(T myFiled) {
  28. this.myFiled = myFiled;
  29. }
  30. }
  1. package com.igeek_Collection.Izidingyifanxing;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-15:41
  5. */
  6. /**
  7. * 类泛型使用的测试:
  8. *
  9. * 泛型类:在类中使用泛型
  10. *
  11. * 定义:类型的后面<变量> 如:class<E>
  12. * 使用:创建对象的时候确定类型
  13. *
  14. * 一般定义的泛型使用:E T K V
  15. */
  16. public class MyClassTypeDemo {
  17. public static void main(String[] args) {
  18. //测试自己定义的类泛型
  19. MyClass<String> my=new MyClass();
  20. //调用使用泛型类的方法
  21. my.setMyFiled("王嘉尔");
  22. String myFiled=my.getMyFiled();
  23. System.out.println(myFiled);
  24. System.out.println("-----------------------------");
  25. //创建对象的时候指定Integer
  26. MyClass<Integer> my1=new MyClass();
  27. my1.setMyFiled(88);
  28. System.out.println(my1.getMyFiled());
  29. }
  30. }

7.定义和使用含有泛型的方法

  1. package com.igeek_Collection.Izidingyifanxing.fanxingfangfa;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-16:06
  5. */
  6. /**
  7. * 演示泛型方法--在类中定义一个成员变量,使用泛型
  8. *
  9. * 格式:
  10. * 修饰符<T,Q,E············> 返回值的类型 方法名(T t,Q q········){
  11. * //方法上定义的泛型在返回值的前面
  12. * }
  13. */
  14. public class MyClassType {
  15. //定义泛型的方法
  16. public <T> void method(T t){
  17. System.out.println(t);
  18. }
  19. }
  1. package com.igeek_Collection.Izidingyifanxing.fanxingfangfa;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-16:06
  5. */
  6. import com.igeek_Collection.Izidingyifanxing.fanxingfangfa.MyClassType;
  7. /**
  8. * 测试泛型方法
  9. *
  10. * 泛型方法:方法的返回值面前加上<变量>
  11. * 使用:调用方法的时候确定类型
  12. */
  13. public class MyClassTypeDemo2 {
  14. public static void main(String[] args) {
  15. //实例化自己定义的类
  16. MyClassType my=new MyClassType();
  17. //调用方法的时候确定类型
  18. my.method("ABC");//String
  19. my.method(12); //Integer
  20. my.method(12.12);//Double
  21. my.method(true); //Boolean
  22. my.method('A'); //Character
  23. }
  24. }

8.泛型接口

  1. package com.igeek_Collection.Izidingyifanxing.fanxingfangfa3;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-16:15
  5. */
  6. /**
  7. * 自定义泛型的接口
  8. *
  9. * 接口用于规范子类的内容--写抽象方法
  10. */
  11. public interface MyInterType<T> {
  12. //接口中的方法使用接口泛型
  13. public void method(T t);
  14. }
  1. package com.igeek_Collection.Izidingyifanxing.fanxingfangfa3;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-16:17
  5. */
  6. /**
  7. * 接口的实现类
  8. *
  9. * 定义类的时候,仍然不实现接口的数据类型
  10. * 则此时相当于将这种不确定的数据类型使用到了子类当中
  11. * 包含不确定的数据类型的类就是泛型类
  12. *
  13. *
  14. * 在实现接口的时候,必须实现接口中所有的抽象方法和泛型--用于父类中不确定子类具体类型的时候使用
  15. */
  16. public class MyClassInter<T> implements MyInterType<T> {
  17. @Override
  18. public void method(T t) {
  19. System.out.println(t);
  20. }
  21. }
  1. package com.igeek_Collection.Izidingyifanxing.fanxingfangfa3;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-16:21
  5. */
  6. /**
  7. * 测试泛型接口--在使用的时候才会确定类型
  8. */
  9. public class MyClassInterTest {
  10. public static void main(String[] args) {
  11. //实例化子类
  12. MyClassInter<String> my=new MyClassInter<>();
  13. // my.method(23232326262333);//泛型不匹配
  14. my.method("年轻的时候不拼搏,老了拿什么谈曾经");
  15. }
  16. }
  1. package com.igeek_Collection.Izidingyifanxing.fanxingfangfa4;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-07-16:38
  5. */
  6. import java.util.ArrayList;
  7. /**
  8. * 泛型的作用:约束数据类型
  9. * 优点:
  10. * 1.提高了程序的安全性:将运行期的问题提前到编译期进行处理
  11. * 2.提高了程序的性能:省去了类型之间转换的时间
  12. *
  13. * 泛型的通配符:
  14. * 演示--谨慎使用--用于汇总数据
  15. */
  16. public class Demo {
  17. public static void main(String[] args) {
  18. //定义一个集合
  19. ArrayList<String> list=new ArrayList<>();
  20. list.add("王");
  21. list.add("嘉");
  22. list.add("尔");
  23. ArrayList<Integer> listB=new ArrayList<>();
  24. listB.add(1);
  25. listB.add(2);
  26. listB.add(3);
  27. //利用泛型的最高级别处理--泛型一定是对象类型--顶级父类--Object
  28. Object o=new String();//向上造型
  29. ArrayList<Object> listA=new ArrayList<>(list);
  30. listA.add("好");
  31. listA.add("帅");
  32. System.out.println(listA);
  33. ArrayList<Object> listA1=new ArrayList<>(listB);
  34. listA1.add("好");
  35. listA1.add("帅");
  36. System.out.println(listA1);
  37. }
  38. }

9.扑克牌案例

  1. /**
  2. * @author Lynn
  3. * @create 2020-12-08-9:10
  4. */
  5. import java.util.ArrayList;
  6. import java.util.Collections;
  7. /**
  8. * 按照斗地主的规则,完成洗牌发牌的动作。
  9. * ♣♦♠♥大☺小☺
  10. * 具体规则:
  11. * 使用54张牌打乱顺序
  12. * 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
  13. * 3.2 斗地主需求分析:
  14. * A:准备牌:
  15. * 牌可以设计为一个ArrayList<String>,每个字符串为一张牌。
  16. * 每张牌由花色、数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。
  17. * 牌由Collections类的shuffle方法进行随机排序。
  18. * B:发牌:
  19. * 将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
  20. * C:看牌:
  21. * 直接打印每个集合
  22. */
  23. public class CardDemo {
  24. public static void main(String[] args) {
  25. //准备牌
  26. //集合中记录的是54张牌
  27. ArrayList<String> list=new ArrayList<>();
  28. //定义花色--定义一个集合用于存在花色
  29. ArrayList<String> colors=new ArrayList<>();
  30. colors.add("♣");
  31. colors.add("♦");
  32. colors.add("♠");
  33. colors.add("♥");
  34. //定义一个集合用于存放数字
  35. ArrayList<String> numbers=new ArrayList<>();
  36. //使用循环赋值
  37. for (int i = 2; i <=10 ; i++) {
  38. numbers.add(i+"");
  39. }
  40. numbers.add("J");
  41. numbers.add("Q");
  42. numbers.add("K");
  43. numbers.add("A");
  44. //嵌套迭代的方式完成每张牌的组装--放了52张
  45. //利用增强for循环
  46. for (String thisColor:colors){//外层循环遍历花色
  47. for (String thisNumber:numbers){//内层循环遍历数字
  48. //通过花色与数字对应成每张牌
  49. String thisCard=thisColor+thisNumber;//字符串的拼接
  50. //将拼接好的牌放入整副牌的集合中
  51. list.add(thisCard);
  52. }
  53. }
  54. //补充大小王
  55. list.add("大☺");
  56. list.add("小☺");
  57. //测试
  58. // System.out.println(list);
  59. //洗牌---直接调用方法
  60. //Collections是一个集合工具类,提供了很多的集合中处理的静态方法
  61. Collections.shuffle(list);
  62. //测试
  63. // System.out.println(list);
  64. //发牌---将每个人以及底牌设置为一个集合,最后的3张底牌直接存放到底牌中,
  65. //剩余牌通过对3进行取余依次发牌
  66. ArrayList<String> player1=new ArrayList<>();
  67. ArrayList<String> player2=new ArrayList<>();
  68. ArrayList<String> player3=new ArrayList<>();
  69. ArrayList<String> dipai=new ArrayList<>();
  70. //使用普通for循环,通过下标进行处理
  71. //除了最后的三张牌,其他的都发给玩家
  72. for (int i = 0; i < list.size()-3; i++) {
  73. //获取当前这张牌
  74. String thisCard= list.get(i);
  75. //对3进行取余
  76. if (i%3==0){
  77. player1.add(thisCard);
  78. }else if (i%3==1){
  79. player2.add(thisCard);
  80. }else {
  81. player3.add(thisCard);
  82. }
  83. }
  84. //最后的3张底牌--从倒数第3张牌开始发
  85. for (int i = list.size()-3; i < list.size() ; i++) {
  86. //抽取这张牌
  87. String thisCard= list.get(i);
  88. dipai.add(thisCard);
  89. }
  90. //看牌
  91. System.out.println(player1);
  92. System.out.println(player2);
  93. System.out.println(player3);
  94. System.out.println(dipai);
  95. }
  96. }