Collection集合

文章目录

集合

1. Collection

1.1集合基础知识回顾

集合类的特点:提供一种存储空间可见的存储模型,存储的数据容量可以随时发生改变。

1.2 集合类体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RpNukL9K-1627886892871)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210617211801618.png)]

1.3 Collection集合概述和使用

Collection集合概述

  • 是单例集合的顶层接口,它表示一组对象这写对象也称为Collection的元素
  • JDK 不提供此接口的任何直接实现,它提供了更具体的子接口(如Set和List实现)

创建Collection集合的对象

  • 多态的形式
  • 具体的实现类 ArrayList

1.4 Collection集合常用方法

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合元素的个数

1.5 Collection 集合的遍历

Iterator :迭代器,集合的专业遍历方式

  • Iterator iterator(): 返回此集合的iterator()方法得到
  • 迭代器是通过集合的iterator方法得到的,所以我i们说它是依赖于集合而存在的

Iterator中的常用方法

  • E next() :返回迭代器中的下一个元素
  • boolean hasNext(): 如果迭代器具有更多元素,则返回true

1.6 集合的使用步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7MHNTQdL-1627886892892)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210617224058848.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clBzBJrS-1627886892894)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210617224221763.png)]

1.7 案例: Collection集合存储学生对象并遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建Collection集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合(迭代器方式)

1.8 Collection概述和使用

Collection类的概述

  • 是针对集合操作的工具类

Collection类的常用方法

  • public static <T extends Comparable<? super T> void sort(List list) :将指定的列表按升序排列
  • public static void reverse(List<?> list): 反转指定列表中元素的顺序
  • public static void shuffle(List<?> list) : 使用默认的随机源随机排列指定的列表

1.9模拟斗地主

需求:通过程序实现斗地主过程中洗牌、发牌和看牌过程

思路:

  • 创建一个牌盒。也就是定义一个集合对象,用ArrayList集合实现
  • 在牌盒里面装牌
  • 洗牌,也就是把牌打散,通过Collections的shuffle()方法实现
  • 发牌:通过i的值进行判断
  • 看牌:也就是三位玩家分别遍历自己的牌
package com.fun04;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

/**
 * @author 23389.
 * @date 2021/6/29.
 */
public class CollectionDemo {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<String> pokerArr = new ArrayList<String>();

        //添加牌
        String[] colors = new String[] {"♦","♣","♥","♠"};
        String[] number = new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

        for(String c : colors){
            for(String n : number){
                String poker = c + n;
                pokerArr.add(poker);
            }
        }
        pokerArr.add("小王");
        pokerArr.add("大王");

        Collections.shuffle(pokerArr);

        ArrayList<String> player1 = new ArrayList<String>();
        ArrayList<String> player2 = new ArrayList<String>();
        ArrayList<String> player3 = new ArrayList<String>();
        ArrayList<String> dppoker = new ArrayList<String>();

        for(int i = 0;i < pokerArr.size();i++){
            String poker = pokerArr.get(i);
            if(pokerArr.size() - i <= 3 ){
                dppoker.add(poker);
            }else if(i % 3 == 0){
                player1.add(poker);
            }else if(i % 3 == 1){
                player2.add(poker);
            }else if(i % 3 == 2){
                player3.add(poker);
            }
        }

        showPoker("player1",player1);
        showPoker("player2",player2);
        showPoker("player3",player3);
        showPoker("dipai",dppoker);


//        System.out.println(pokerArr);
    }


    //看牌的方法
    public static void showPoker(String name,ArrayList<String> arr){
        System.out.print(name + "的牌是:");
        for(String s : arr){
            System.out.print(s);
        }
        System.out.println();
    }
}

1.10 模拟斗地主升级版

需求:通过程序实现斗地主过程中洗牌、发牌和看牌过程 对牌进行排序

思路:

  • 创建HashMap对象,键是编号,值是牌
  • 创建ArrayList集合对象,存储编号
  • 创建花色数组和点数数组
  • 从0开始往HashMap集合里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号
  • 洗牌(洗的是编号)也就是把牌打散,通过Collections的shuffle()方法实现
  • 发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收)
  • 看牌:定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找到对应的牌)
  • 调用看牌方法‘
package com.fun04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

/**
 * @author 23389.
 * @date 2021/6/29.
 */
public class CollectionDemo02 {
    public static void main(String[] args) {
        //创建HashMap集合对象
        HashMap<Integer,String> hm = new HashMap<Integer,String>();

        //创建ArrayList对象,存储编号
        ArrayList<Integer> arrNum = new ArrayList<Integer>();

//        for(int i = 0; i <= 52;i++){
//            arrNum.add(i);
//        }


        //创建花色和点数数组
        String[] colors = new String[] {"♦","♣","♥","♠"};
        String[] num = new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

        //从开始往HashMap里面存储编号,并存储对应的值,同时在ArrayList里面存储编号
        int index = 0;

        for(String c : colors){
            for(String n : num){
                hm.put(index,c + n);
                arrNum.add(index);
                index++;
            }
        }

        hm.put(index,"小王");
        arrNum.add(index);
        index++;

        hm.put(index,"大王");
        arrNum.add(index);

//        洗牌
        Collections.shuffle(arrNum);

//        发牌(发的是编号,为保证编号排序,创建TreeSet集合接收)
        TreeSet<Integer> player1 = new TreeSet<Integer>();
        TreeSet<Integer> player2 = new TreeSet<Integer>();
        TreeSet<Integer> player3 = new TreeSet<Integer>();
        TreeSet<Integer> dp = new TreeSet<Integer>();

        for(int i = 0;i < arrNum.size();i++){
            int x = arrNum.get(i);
            if(i >= arrNum.size() - 3){
                dp.add(x);
            }else if(i % 3 == 0){
                player1.add(x);
            }else if(i % 3 == 1){
                player2.add(x);
            }else if(i % 3 == 2){
                player3.add(x);
            }
        }

        //调用方法看牌
        showPoker("player1",player1,hm);
        showPoker("player2",player2,hm);
        showPoker("player3",player3,hm);
        showPoker("dp",dp,hm);
//        System.out.println(arrNum);

    }
    //定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找到对应的牌)
    public static void showPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm){
        System.out.print(name + "的牌是:");
        for(Integer key: ts){
            String poker = hm.get(key);
            System.out.print(poker + " ");
        }
        System.out.println();

    }

}

2. List

2.1 List集合的概述和特点

List集合概述

  • 有序集合(也称为序列),用户可以精确的控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素。
  • 与Set集合不同,列表通常允许重复的元素

List集合特点

  • 有序:存储和取出的元素顺序一致
  • 可重复:存储的元素可以重复

2.2 List集合的特有方法

方法名说明
void add(int index,E element)在此集合的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回索引处的元素

2.3 List集合存储学生对象并遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建List集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合(迭代器方式,for循环方式)

2.4 并发修改异常

并发修改异常

  • ConcurrentModificationException

产生原因

  • 迭代器遍历的过程,通过集合对象修改集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致。

解决方案

  • 同for循环遍历,然后用集合对象做对应的操作即可

2.5 ListIterator

Listiterator:列表迭代器

  • 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
  • 通过允许程序员沿任一方向遍历列表的列表迭代器,在迭代器可修改列表,并获取列表迭代器的当前位置

ListIerator中的常用方法

  • E next() :返回迭代中的下一个元素
  • boolean hasNext() :如果迭代具有更多的元素,则返回true
  • E previous() :返回列表中的上一个元素
  • boolean hasPrevious() : 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
  • void add(E e):将指定元素插入列表

2.6 增强for循环

增强for:能强化数组和Collection集合的遍历

  • 实现Iterator接口的类允许其对象成为增强for语句目标
  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

增强for的格式

  • 格式:

for(元素数据类型 变量名 : 数组或者Collection集合){

//在此处使用变量访问,该变量就是元素

}

  • 范例:
int[] arr = {1,2,3,4,5};
for(int i : arr){
  System.out.println(i);
}

2.7 案例:List集合存储学生对象用三种方式遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建List集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合

​ 迭代器:集合特有的遍历方式

​ 普通for循环:带有索引的遍历方式

​ 增强for循环:最方便的方式

2.8 数据结构

数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多中国特定关系的数据元素的集合

通常情况下,精心选择的数据结构都可以带来更高的运行或存储效率

2.9 常见数据之栈

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GoDGrjf-1627886892897)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620111513957.png)]

​ 数据进入栈模型的过程称为:压/进栈

​ 数据离开栈模型的过程称为:弹/出栈

栈是一种数据先进后出的模型

2.10常见数据结构之队列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kFW727k-1627886892903)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620111554023.png)]

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

队列是一种先进先出,后进后出的模型

2.11 常见数据结构之数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAraJm8B-1627886892904)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620112059328.png)]

数组是一种查询快,增删慢的模型

2.12 常见数据结构之链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyJ9WRIe-1627886892905)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620112433288.png)]

链表连接过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KV6hQe9B-1627886892906)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620112615518.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iso9xjjN-1627886892907)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620112736031.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AwJ39OBv-1627886892908)(C:\Users\23389\AppData\Roaming\Typora\typora-user-images\image-20210620112947783.png)]

链表是一种增删块的模型(对比数组)

链表是一种查询慢的模型(对比数组)

查询数据是否存在,必须从头(head)开始查询

2.13 :List集合子类特点

list集合的常用子类:ArrayList,LinkedList

  • ArrayList:底层数据结构是数组,查询快,增删慢
  • LinkedList:底层数据结构是链表,查询慢,增删快

练习:分别使用ArrayList和LinkedList完成存储字符串并遍历

package com.fun07;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * @author 23389.
 * @date 2021/6/20.
 */

/*
list集合的常用子类:ArrayList,LinkedList

- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快

练习:分别使用ArrayList和LinkedList完成存储字符串并遍历


 */

public class ListDemo {
    public static void main(String[] args){
        //创建集合对象
        ArrayList<String> array = new ArrayList<String>();
        array.add("hello");
        array.add("world");
        array.add("java");
        //遍历
        Iterator<String> it = array.iterator();
        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("-------");
        for(int i = 0;i < array.size();i++){
            String s = array.get(i);
            System.out.println(s);
        }
        System.out.println("--------");
        for(String s : array){
            System.out.println(s);
        }
        System.out.println("-------");

        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        //遍历
        for(String s : linkedList){
            System.out.println(s);
        }
        System.out.println("-------");
        for(int i = 0;i < linkedList.size();i++){
            String s = linkedList.get(i);
            System.out.println(s);
        }
        System.out.println("----------");

        Iterator<String> it2 = linkedList.iterator();
        while(it2.hasNext()){
            String s = it2.next();
            System.out.println(s);
        }
    }


}

2.14 案例:ArrayList 集合存储学生对象 用三种方式遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建ArrayList集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合

​ 迭代器:集合特有的遍历方式

​ 普通for循环:带有索引的遍历方式

​ 增强for循环:最方便的方式

package com.fun08;

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

/**
 * @author 23389.
 * @date 2021/6/20.
 */
public class ArrayListDemo {
    public static void main(String[] args){
        ArrayList<Student> arr = new ArrayList<Student>();
        Student s1 = new Student("张三",18);
        Student s2 = new Student("李四",20);
        Student s3 = new Student("王五",19);
        arr.add(s1);
        arr.add(s2);
        arr.add(s3);
        //遍历
        Iterator<Student> it = arr.iterator();
        while(it.hasNext()){
            Student s = it.next();
            System.out.println(s.getName() + "," + s.getAge());
        }
        System.out.println("-------");
        for(int i = 0;i < arr.size();i++){
            Student s = arr.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
        System.out.println("----------");
        for(Student s : arr){
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}

2.15 LinkedList集合的特有功能

方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

案例:

package com.fun09;

import java.util.LinkedList;

/**
 * @author 23389.
 * @date 2021/6/20.
 */

/*
| 方法名                    | 说明                             |
| ------------------------- | -------------------------------- |
| public void addFirst(E e) | 在该列表开头插入指定的元素       |
| public void addLast(E e)  | 将指定的元素追加到此列表的末尾   |
| public E getFirst()       | 返回此列表中的第一个元素         |
| public E getLast()        | 返回此列表的最后一个元素         |
| public E removeFirst()    | 从此列表中删除并返回第一个元素   |
| public E removeLast()     | 从此列表中删除并返回最后一个元素 |


 */

public class LinkedListDemo {
    public static void main(String[] args){
        //创建集合对象
        LinkedList<String> linkedList = new LinkedList<String>();

        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
//        | public void addFirst(E e) | 在该列表开头插入指定的元素       |
//        | public void addLast(E e)  | 将指定的元素追加到此列表的末尾    |
//        linkedList.addFirst("javase");
//        linkedList.addLast("javaee");

//        public E getFirst()       | 返回此列表中的第一个元素         |
//        public E getLast()        | 返回此列表的最后一个元素         |
//        System.out.println(linkedList.getFirst());
//        System.out.println(linkedList.getLast());

//        | public E removeFirst()    | 从此列表中删除并返回第一个元素   |
//        | public E removeLast()     | 从此列表中删除并返回最后一个元素 |
        linkedList.removeFirst();
        linkedList.removeLast();
        System.out.println(linkedList);
    }
}

集合

1. Collection

1.1集合基础知识回顾

集合类的特点:提供一种存储空间可见的存储模型,存储的数据容量可以随时发生改变。

1.2 集合类体系结构

在这里插入图片描述

1.3 Collection集合概述和使用

Collection集合概述

  • 是单例集合的顶层接口,它表示一组对象这写对象也称为Collection的元素
  • JDK 不提供此接口的任何直接实现,它提供了更具体的子接口(如Set和List实现)

创建Collection集合的对象

  • 多态的形式
  • 具体的实现类 ArrayList

1.4 Collection集合常用方法

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合元素的个数

1.5 Collection 集合的遍历

Iterator :迭代器,集合的专业遍历方式

  • Iterator iterator(): 返回此集合的iterator()方法得到
  • 迭代器是通过集合的iterator方法得到的,所以我i们说它是依赖于集合而存在的

Iterator中的常用方法

  • E next() :返回迭代器中的下一个元素
  • boolean hasNext(): 如果迭代器具有更多元素,则返回true

1.6 集合的使用步骤

在这里插入图片描述

在这里插入图片描述

1.7 案例: Collection集合存储学生对象并遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建Collection集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合(迭代器方式)

1.8 Collection概述和使用

Collection类的概述

  • 是针对集合操作的工具类

Collection类的常用方法

  • public static <T extends Comparable<? super T> void sort(List list) :将指定的列表按升序排列
  • public static void reverse(List<?> list): 反转指定列表中元素的顺序
  • public static void shuffle(List<?> list) : 使用默认的随机源随机排列指定的列表

1.9模拟斗地主

需求:通过程序实现斗地主过程中洗牌、发牌和看牌过程

思路:

  • 创建一个牌盒。也就是定义一个集合对象,用ArrayList集合实现
  • 在牌盒里面装牌
  • 洗牌,也就是把牌打散,通过Collections的shuffle()方法实现
  • 发牌:通过i的值进行判断
  • 看牌:也就是三位玩家分别遍历自己的牌
package com.fun04;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

/**
 * @author 23389.
 * @date 2021/6/29.
 */
public class CollectionDemo {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<String> pokerArr = new ArrayList<String>();

        //添加牌
        String[] colors = new String[] {"♦","♣","♥","♠"};
        String[] number = new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

        for(String c : colors){
            for(String n : number){
                String poker = c + n;
                pokerArr.add(poker);
            }
        }
        pokerArr.add("小王");
        pokerArr.add("大王");

        Collections.shuffle(pokerArr);

        ArrayList<String> player1 = new ArrayList<String>();
        ArrayList<String> player2 = new ArrayList<String>();
        ArrayList<String> player3 = new ArrayList<String>();
        ArrayList<String> dppoker = new ArrayList<String>();

        for(int i = 0;i < pokerArr.size();i++){
            String poker = pokerArr.get(i);
            if(pokerArr.size() - i <= 3 ){
                dppoker.add(poker);
            }else if(i % 3 == 0){
                player1.add(poker);
            }else if(i % 3 == 1){
                player2.add(poker);
            }else if(i % 3 == 2){
                player3.add(poker);
            }
        }

        showPoker("player1",player1);
        showPoker("player2",player2);
        showPoker("player3",player3);
        showPoker("dipai",dppoker);


//        System.out.println(pokerArr);
    }


    //看牌的方法
    public static void showPoker(String name,ArrayList<String> arr){
        System.out.print(name + "的牌是:");
        for(String s : arr){
            System.out.print(s);
        }
        System.out.println();
    }
}

1.10 模拟斗地主升级版

需求:通过程序实现斗地主过程中洗牌、发牌和看牌过程 对牌进行排序

思路:

  • 创建HashMap对象,键是编号,值是牌
  • 创建ArrayList集合对象,存储编号
  • 创建花色数组和点数数组
  • 从0开始往HashMap集合里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号
  • 洗牌(洗的是编号)也就是把牌打散,通过Collections的shuffle()方法实现
  • 发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收)
  • 看牌:定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找到对应的牌)
  • 调用看牌方法‘
package com.fun04;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

/**
 * @author 23389.
 * @date 2021/6/29.
 */
public class CollectionDemo02 {
    public static void main(String[] args) {
        //创建HashMap集合对象
        HashMap<Integer,String> hm = new HashMap<Integer,String>();

        //创建ArrayList对象,存储编号
        ArrayList<Integer> arrNum = new ArrayList<Integer>();

//        for(int i = 0; i <= 52;i++){
//            arrNum.add(i);
//        }


        //创建花色和点数数组
        String[] colors = new String[] {"♦","♣","♥","♠"};
        String[] num = new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

        //从开始往HashMap里面存储编号,并存储对应的值,同时在ArrayList里面存储编号
        int index = 0;

        for(String c : colors){
            for(String n : num){
                hm.put(index,c + n);
                arrNum.add(index);
                index++;
            }
        }

        hm.put(index,"小王");
        arrNum.add(index);
        index++;

        hm.put(index,"大王");
        arrNum.add(index);

//        洗牌
        Collections.shuffle(arrNum);

//        发牌(发的是编号,为保证编号排序,创建TreeSet集合接收)
        TreeSet<Integer> player1 = new TreeSet<Integer>();
        TreeSet<Integer> player2 = new TreeSet<Integer>();
        TreeSet<Integer> player3 = new TreeSet<Integer>();
        TreeSet<Integer> dp = new TreeSet<Integer>();

        for(int i = 0;i < arrNum.size();i++){
            int x = arrNum.get(i);
            if(i >= arrNum.size() - 3){
                dp.add(x);
            }else if(i % 3 == 0){
                player1.add(x);
            }else if(i % 3 == 1){
                player2.add(x);
            }else if(i % 3 == 2){
                player3.add(x);
            }
        }

        //调用方法看牌
        showPoker("player1",player1,hm);
        showPoker("player2",player2,hm);
        showPoker("player3",player3,hm);
        showPoker("dp",dp,hm);
//        System.out.println(arrNum);

    }
    //定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找到对应的牌)
    public static void showPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm){
        System.out.print(name + "的牌是:");
        for(Integer key: ts){
            String poker = hm.get(key);
            System.out.print(poker + " ");
        }
        System.out.println();

    }

}

2. List

2.1 List集合的概述和特点

List集合概述

  • 有序集合(也称为序列),用户可以精确的控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素。
  • 与Set集合不同,列表通常允许重复的元素

List集合特点

  • 有序:存储和取出的元素顺序一致
  • 可重复:存储的元素可以重复

2.2 List集合的特有方法

方法名说明
void add(int index,E element)在此集合的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回索引处的元素

2.3 List集合存储学生对象并遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建List集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合(迭代器方式,for循环方式)

2.4 并发修改异常

并发修改异常

  • ConcurrentModificationException

产生原因

  • 迭代器遍历的过程,通过集合对象修改集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致。

解决方案

  • 同for循环遍历,然后用集合对象做对应的操作即可

2.5 ListIterator

Listiterator:列表迭代器

  • 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
  • 通过允许程序员沿任一方向遍历列表的列表迭代器,在迭代器可修改列表,并获取列表迭代器的当前位置

ListIerator中的常用方法

  • E next() :返回迭代中的下一个元素
  • boolean hasNext() :如果迭代具有更多的元素,则返回true
  • E previous() :返回列表中的上一个元素
  • boolean hasPrevious() : 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
  • void add(E e):将指定元素插入列表

2.6 增强for循环

增强for:能强化数组和Collection集合的遍历

  • 实现Iterator接口的类允许其对象成为增强for语句目标
  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

增强for的格式

  • 格式:

for(元素数据类型 变量名 : 数组或者Collection集合){

//在此处使用变量访问,该变量就是元素

}

  • 范例:
int[] arr = {1,2,3,4,5};
for(int i : arr){
  System.out.println(i);
}

2.7 案例:List集合存储学生对象用三种方式遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建List集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合

​ 迭代器:集合特有的遍历方式

​ 普通for循环:带有索引的遍历方式

​ 增强for循环:最方便的方式

2.8 数据结构

数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多中国特定关系的数据元素的集合

通常情况下,精心选择的数据结构都可以带来更高的运行或存储效率

2.9 常见数据之栈

在这里插入图片描述

​ 数据进入栈模型的过程称为:压/进栈

​ 数据离开栈模型的过程称为:弹/出栈

栈是一种数据先进后出的模型

2.10常见数据结构之队列

在这里插入图片描述

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

队列是一种先进先出,后进后出的模型

2.11 常见数据结构之数组

在这里插入图片描述

数组是一种查询快,增删慢的模型

2.12 常见数据结构之链表

在这里插入图片描述

链表连接过程:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

链表是一种增删块的模型(对比数组)

链表是一种查询慢的模型(对比数组)

查询数据是否存在,必须从头(head)开始查询

2.13 :List集合子类特点

list集合的常用子类:ArrayList,LinkedList

  • ArrayList:底层数据结构是数组,查询快,增删慢
  • LinkedList:底层数据结构是链表,查询慢,增删快

练习:分别使用ArrayList和LinkedList完成存储字符串并遍历

package com.fun07;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * @author 23389.
 * @date 2021/6/20.
 */

/*
list集合的常用子类:ArrayList,LinkedList

- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快

练习:分别使用ArrayList和LinkedList完成存储字符串并遍历


 */

public class ListDemo {
    public static void main(String[] args){
        //创建集合对象
        ArrayList<String> array = new ArrayList<String>();
        array.add("hello");
        array.add("world");
        array.add("java");
        //遍历
        Iterator<String> it = array.iterator();
        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("-------");
        for(int i = 0;i < array.size();i++){
            String s = array.get(i);
            System.out.println(s);
        }
        System.out.println("--------");
        for(String s : array){
            System.out.println(s);
        }
        System.out.println("-------");

        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        //遍历
        for(String s : linkedList){
            System.out.println(s);
        }
        System.out.println("-------");
        for(int i = 0;i < linkedList.size();i++){
            String s = linkedList.get(i);
            System.out.println(s);
        }
        System.out.println("----------");

        Iterator<String> it2 = linkedList.iterator();
        while(it2.hasNext()){
            String s = it2.next();
            System.out.println(s);
        }
    }


}

2.14 案例:ArrayList 集合存储学生对象 用三种方式遍历

需求:创建一个学生对象的集合,存储三个学生对象,使用程序是实现在控制台遍历该集合。

思路:

①定义学生类

②创建ArrayList集合对象

③创建学生对象

④把学生添加到集合

⑤遍历集合

​ 迭代器:集合特有的遍历方式

​ 普通for循环:带有索引的遍历方式

​ 增强for循环:最方便的方式

package com.fun08;

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

/**
 * @author 23389.
 * @date 2021/6/20.
 */
public class ArrayListDemo {
    public static void main(String[] args){
        ArrayList<Student> arr = new ArrayList<Student>();
        Student s1 = new Student("张三",18);
        Student s2 = new Student("李四",20);
        Student s3 = new Student("王五",19);
        arr.add(s1);
        arr.add(s2);
        arr.add(s3);
        //遍历
        Iterator<Student> it = arr.iterator();
        while(it.hasNext()){
            Student s = it.next();
            System.out.println(s.getName() + "," + s.getAge());
        }
        System.out.println("-------");
        for(int i = 0;i < arr.size();i++){
            Student s = arr.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
        System.out.println("----------");
        for(Student s : arr){
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}

2.15 LinkedList集合的特有功能

方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

案例:

package com.fun09;

import java.util.LinkedList;

/**
 * @author 23389.
 * @date 2021/6/20.
 */

/*
| 方法名                    | 说明                             |
| ------------------------- | -------------------------------- |
| public void addFirst(E e) | 在该列表开头插入指定的元素       |
| public void addLast(E e)  | 将指定的元素追加到此列表的末尾   |
| public E getFirst()       | 返回此列表中的第一个元素         |
| public E getLast()        | 返回此列表的最后一个元素         |
| public E removeFirst()    | 从此列表中删除并返回第一个元素   |
| public E removeLast()     | 从此列表中删除并返回最后一个元素 |


 */

public class LinkedListDemo {
    public static void main(String[] args){
        //创建集合对象
        LinkedList<String> linkedList = new LinkedList<String>();

        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
//        | public void addFirst(E e) | 在该列表开头插入指定的元素       |
//        | public void addLast(E e)  | 将指定的元素追加到此列表的末尾    |
//        linkedList.addFirst("javase");
//        linkedList.addLast("javaee");

//        public E getFirst()       | 返回此列表中的第一个元素         |
//        public E getLast()        | 返回此列表的最后一个元素         |
//        System.out.println(linkedList.getFirst());
//        System.out.println(linkedList.getLast());

//        | public E removeFirst()    | 从此列表中删除并返回第一个元素   |
//        | public E removeLast()     | 从此列表中删除并返回最后一个元素 |
        linkedList.removeFirst();
        linkedList.removeLast();
        System.out.println(linkedList);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值