一、集合类的总结
集合的长度是可以随意改变的,但是集合只能存储对象,不能存储基本数据类型,但是可以存储自动封箱之后的基本数据类型(int--->Integer),且集合没有默认值
List:有序的、有索引值、允许重复
Set: 无序的、无索引值、不允许重复
HashMap:会对存入的数据进行自动排序、以键值对的形式存储、键不允许重复、值允许重复
Collection遍历集合的三种方式
1.使用size()和get()进行遍历
2.使用迭代器Iterator进行遍历
3.使用增强for进行遍历

Map集合遍历集合的两种方式
1.使用keyset()进行遍历
2.使用entryset()进行遍历

Collection和Map都是集合体系的最顶层,两者没有任何联系
常见异常
1.Collection集合是无法使用add(),会报并发修改异常。而List集合是可以使用add(),不会报异常
2.Set集合如果想要去重必须重写hashcode()和equals(),如果不重写就能重复添加一个元素
3.TreeSet集合如果想添加多个不重复的元素就必须实现Comparable,并且重写它的compareTo()
可以使用Collections工具类操作集合对象,因为它里面封装了很多操作集合的方法
ArrayList和LinkedList如何选择使用
1.对于查询速率有要求的建议使用ArrayList
2.对于增删速率有要求的建议使用LinkedList
ArrayList的底层实现是数组:连续的、有顺序、查找快、增删慢
LinkedList的底层实现是链表:不是连续的、但是有顺序、查找慢、增删快
HashSet的底层实现是Hash表
TreeSet的底层实现是二叉树
Map的底层实现是Hash表+红黑树
二、Map集合如何对key(键)去重
package com.bianyiit.cast;

import java.util.Objects;

public class Person implements Comparable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Object o){
        Person p=(Person)o;
        if(this.age>p.age){
            return 1;
        }else if(this.age==p.getAge()){
            return 0;
        }else if(this.age<p.age){
            return -1;
        }
        return 0;
    }


    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
	//重写hashcode()和equals()方法去重
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
package com.bianyiit.anli;

import com.bianyiit.cast.Person;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class DemoHashMapStudent {
    public static void main(String[] args) {
       Map<Person,String> m=new HashMap();
       Person p1=new Person("张三",18);
       Person p2=new Person("李四",13);
       Person p3=new Person("王五",18);
       Person p4=new Person("王五",18);
       Person p5=new Person("赵六",20);
       //put()--映射功能,判断集合中是否有相同的key,没有相同的key时,返回值是null,并且把元素添加进集合中去
       //如果有相同的key,返回的是被覆盖的value,添加到集合中把原来的value覆盖掉
       //使用Person对象作为键key,使用id作为值value
       m.put(p1,"1");
       m.put(p2,"2");
       m.put(p3,"3");
       m.put(p4,"4");
       m.put(p5,"5");
       //在Person类里面写对象的去重
       Set<Map.Entry<Person, String>> entries = m.entrySet();
       for (Map.Entry<Person, String> entry : entries) {
           Person key = entry.getKey();
           String value = entry.getValue();
           System.out.println(key+":"+value);
       }
    }
}
//自定义对象作为Map图的key时,要想去重,必须在自定义类里面去重写object的hashcode()和equals(),因为key是放在set集合中,不能重复
//输出结果:
	Person{name='王五', age=18}:4
	Person{name='赵六', age=20}:5
	Person{name='张三', age=18}:1
	Person{name='李四', age=13}:2
获取指定字符串单个字符的内容和出现的次数
package com.bianyiit.anli;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class ZifuChuangZiShu {
    public static void main(String[] args) {
        //判断字符串出现的次数
        String s="zhangsanlisiwangwuzhaoliu";
        //定义一个map集合
        Map<Character,Integer> m=new HashMap<>();
        //遍历字符串
        for (int i = 0; i <s.length() ; i++) {
            char ch=s.charAt(i);
            if(m.containsKey(ch)){   //通过contains判断集合中是否有key
                int value=(int)m.get(ch);
                value++;
                m.put(ch,value);
            }else{
                m.put(ch,1);
            }
        }
        //遍历集合的第一种方法
        Set<Character> keys = m.keySet();
        for (Object key : keys) {
            Integer value = m.get(key);
            System.out.println(key+":"+value);
        }
        //遍历集合的第二种方法
        /*Set<Map.Entry<Character, Integer>> set = m.entrySet();
        for (Map.Entry<Character, Integer> Entry : set) {
            Character key = Entry.getKey();
            Integer value = Entry.getValue();
            System.out.println(key+":"+value);
        }*/
        System.out.println(m);
    }
}
//输出结果
	{a=4, s=2, u=2, g=2, w=2, h=2, i=3, z=2, l=2, n=3, o=1}
四、集合类综合应用–学生管理系统

学生类Student.java

package com.bianyiit.cast;

import java.util.Objects;

public class Student {
    //ID 姓名 性别 班级
    private String name;
    private int id;
    private String classname;
    private String sex;
    //生成get和set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name.length()<=4){
            this.name = name;
        }else{
            this.name = "xxx";
        }
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        if(id>=1&&id<=100){
            this.id = id;
        }else{
            this.id = 0;
        }
    }

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        if(classname.equals("102")||classname.equals("103")){
            this.classname = classname;
        }else{
            this.classname = "null";
        }
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        if(sex.equals("男")||sex.equals("女")){
            this.sex = sex;
        }else{
            this.sex = "不明";
        }
    }
    //无参构造方法
    public Student() {
    }
    //有参构造方法
    public Student(String name, int id, String classname, String sex) {
        this.name = name;
        this.id = id;
        this.classname = classname;
        this.sex = sex;
    }
    //重写equasls()

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                sex == student.sex &&
                Objects.equals(name, student.name) &&
                Objects.equals(classname, student.classname);
    }
    //重写hashcode()
    @Override
    public int hashCode() {
        return Objects.hash(name, id, classname, sex);
    }
    //重写toString()
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", classname='" + classname + '\'' +
                ", sex=" + sex +
                '}';
    }
}

测试类StudentManage

package com.bianyiit.cast;

import org.omg.CORBA.ARG_IN;

import java.util.ArrayList;
import java.util.Scanner;

public class StudentManage {
    public static void main(String[] args) {
        ArrayList<Student> arr=new ArrayList<Student>();   //使用集合保存学生信息
        while(true){
            System.out.println("----Welcome To Student Manage----");
            System.out.println("1.查看所有的学生信息");
            System.out.println("2.添加学生");
            System.out.println("3.删除学生");
            System.out.println("4.修改学生");
            System.out.println("5.退出系统");
            System.out.print("请输入您的选择[num]:");
            //扫描器
            Scanner sc=new Scanner(System.in);
            int i = sc.nextInt();
            //通过switch去实现各个功能
            switch (i){
                case 1:
                    FindAllStudent(arr);
                    break;
                case 2:
                    InsertStudent(arr);
                    break;
                case 3:
                    deleteStu(arr);
                    break;
                case 4:
                    changeStu(arr);
                    break;
                case 5:
                    System.out.println("已成功退出系统!!");
                    System.exit(0);   //退出系统
                    break;
                default:
                    break;
            }
        }
    }

    public static void FindAllStudent(ArrayList<Student> arr) {
        System.out.println("-------------学生信息显示如下---------------");
        System.out.println("学号\t\t姓名\t\t性别\t\t班级\t\t");
        //遍历所有的学生对象
        for (int i = 0; i < arr.size(); i++) {
            Student student = arr.get(i);
            System.out.println(student.getId()+"\t\t\t"+student.getName()+"\t\t"+student.getSex()+"\t\t\t"+student.getClassname());
        }
        System.out.println("-------------------------------------------");
        System.out.println();
    }
    public static void InsertStudent(ArrayList<Student> arr){
        if(arr.isEmpty()){
            int idcode;   //学号
            String name;  //姓名
            String sex;   //性别
            String classname; //班级
            Scanner sc1=new Scanner(System.in);
            Student s=new Student();
            System.out.println("请输入您的学号!");
            idcode = sc1.nextInt();
            s.setId(idcode);
            while(s.getId()==0){
                System.out.println("您输入的ID不正确,只允许从0-100,请重新输入!");
                System.out.println("请输入您的学号!");
                idcode = sc1.nextInt();
                s.setId(idcode);
            }
            System.out.println("请输入您的姓名!");
            name = sc1.next();
            s.setName(name);
            while(s.getName().equals("xxx")){
                System.out.println("姓名不符合要求,请重新输入!");
                System.out.println("请输入您的姓名!");
                name = sc1.next();
                s.setName(name);
            }
            System.out.println("请输入您的性别!");
            sex = sc1.next();
            s.setSex(sex);
            while(s.getSex().equals("不明")){
                System.out.println("对不起,性别只能输入男/女,请重新输入!");
                System.out.println("请输入您的性别!");
                sex = sc1.next();
                s.setSex(sex);
            }
            System.out.println("请输入您的班级!");
            classname = sc1.next();
            s.setClassname(classname);
            while(s.getClassname().equals("null")){
                System.out.println("对不起,班级只能输入102/103,请重新输入!");
                System.out.println("请输入您的班级!");
                classname = sc1.next();
                s.setClassname(classname);
            }
            //通过set方法设置Student的各个属性
            s.setClassname(classname);
            //将Student添加进集合中
            arr.add(s);
            //给出添加成功的提示
            System.out.println("添加成功!");
            System.out.println();
        }else{
            int flag=-1;   //定义一个标识符 如果遍历完之后已经有该学生的学号则更改flag=1
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入您的学号!");
            int idcode = sc.nextInt();
            //遍历集合中所有的元素
            for (int i = 0; i < arr.size(); i++) {
                Student s1 = arr.get(i);
                if(s1.getId()==idcode){
                    flag=1;
                    break;
                }
            }
            if(flag==1){    //与集合中已有的学生对象进行比较如果学号重复
                System.out.println("该学生学号已经存在,不允许添加相同学号的学生!!");
                System.out.println();
            }else{  //与集合中已有的学生对象进行比较如果学号不重复
                //创建一个学生对象
                Student s=new Student();
                System.out.println("请输入您的姓名!");
                String name = sc.next();
                System.out.println("请输入您的性别!");
                String sex = sc.next();
                System.out.println("请输入您的班级!");
                String classname = sc.next();
                //通过set方法设置Student的各个属性
                s.setId(idcode);
                s.setName(name);
                s.setSex(sex);
                s.setClassname(classname);
                //将Student添加进集合中
                arr.add(s);
                //给出添加成功的提示
                System.out.println("添加成功!");
                System.out.println();
            }
        }
    }
    public static void deleteStu(ArrayList<Student> arr){
        //遍历集合
        //如果集合里面没有元素
        if(arr.isEmpty()){
            System.out.println("集合为空,无法进行删除操作!!");
            System.out.println();
        }else{
            int delete=-1;  //定义一个标志用来标识需要删除的对象
            System.out.println("请输入您的学号!");
            int flag=-1;
            Scanner sc=new Scanner(System.in);
            int id = sc.nextInt();
            /*for (Student student : arr) {
                String id1 = student.getId();
                if(id==id1){
                    flag=1;
                    break;
                }
            }*/
            for (int i = 0; i < arr.size(); i++) {
                Student s1 = arr.get(i);
                if(s1.getId()==id){
                    flag=1;
                    delete=i;
                }
            }
            if(flag==1){
                Student student = arr.get(delete);
                arr.remove(student);
                System.out.println("已成功删除该学生!!");
                System.out.println();
            }else{
                System.out.println("系统里面不存在该学生,无法删除!!");
                System.out.println();
            }
        }
    }
    public static void changeStu(ArrayList<Student> arr){
        //遍历集合
        //如果集合里面没有元素
        if(arr.isEmpty()){
            System.out.println("集合为空,无法进行修改操作!!");
            System.out.println();
        }else{
            int delete=-1;  //定义一个标志用来标识需要删除的对象
            System.out.println("请输入您的学号!");
            int flag=-1;
            Scanner sc=new Scanner(System.in);
            int id = sc.nextInt();
            /*for (Student student : arr) {
                String id1 = student.getId();
                if(id==id1){
                    flag=1;
                    break;
                }
            }*/
            for (int i = 0; i < arr.size(); i++) {
                Student s1 = arr.get(i);
                if(s1.getId()==id){
                    flag=1;
                    delete=i;
                }
            }
            if(flag==1){
                Student student = arr.get(delete);
                System.out.print("请输入修改的学生的姓名:");
                String name = sc.next();
                student.setName(name);
                System.out.print("请输入修改的学生的性别:");
                String sex = sc.next();
                student.setSex(sex);
                System.out.print("请输入修改的学生的班级:");
                String classname = sc.next();
                student.setClassname(classname);
                arr.set(delete,student);
                System.out.println("学生信息修改成功!!");
                System.out.println();
            }else{
                System.out.println("系统里面不存在该学生,无法修改!!");
                System.out.println();
            }
        }
    }
}
//输出结果:
	----Welcome To Student Manage----
	1.查看所有的学生信息
	2.添加学生
	3.删除学生
	4.修改学生
	5.退出系统
	请输入您的选择[num]:1
	-------------学生信息显示如下---------------
	学号		姓名		性别		班级		
	-------------------------------------------
	
	----Welcome To Student Manage----
	1.查看所有的学生信息
	2.添加学生
	3.删除学生
	4.修改学生
	5.退出系统
	请输入您的选择[num]:2
	请输入您的学号!
	0
	您输入的ID不正确,只允许从0-100,请重新输入!
	请输入您的学号!
	1
	请输入您的姓名!
	我是大傻缺
	姓名不符合要求,请重新输入!
	请输入您的姓名!
	张三
	请输入您的性别!
	猫
	对不起,性别只能输入男/女,请重新输入!
	请输入您的性别!
	男
	请输入您的班级!
	105
	对不起,班级只能输入102/103,请重新输入!
	请输入您的班级!
	103
	添加成功!
	
	----Welcome To Student Manage----
	1.查看所有的学生信息
	2.添加学生
	3.删除学生
	4.修改学生
	5.退出系统
	请输入您的选择[num]:1
	-------------学生信息显示如下---------------
	学号		姓名		性别		班级		
	1			张三		男			103
	-------------------------------------------
	
	----Welcome To Student Manage----
	1.查看所有的学生信息
	2.添加学生
	3.删除学生
	4.修改学生
	5.退出系统
	请输入您的选择[num]:4
	请输入您的学号!
	1
	请输入修改的学生的姓名:李四
	请输入修改的学生的性别:女
	请输入修改的学生的班级:19
	学生信息修改成功!!
	
	----Welcome To Student Manage----
	1.查看所有的学生信息
	2.添加学生
	3.删除学生
	4.修改学生
	5.退出系统
	请输入您的选择[num]:1
	-------------学生信息显示如下---------------
	学号		姓名		性别		班级		
	1			李四		女			null
	-------------------------------------------
	
	----Welcome To Student Manage----
	1.查看所有的学生信息
	2.添加学生
	3.删除学生
	4.修改学生
	5.退出系统
	请输入您的选择[num]:5
	已成功退出系统!!

该学生管理系统还是有瑕疵,如果小伙伴们对这个系统感兴趣,欢迎大家继续改进!!