集合

集合和数组的区别
相同点：
    集合和数组都是一种容器，可以存储多个数据。
不同点：
    数组长度不可变，集合的长度是可变的。
    数组可以存储基本数据类型也可以存储引用数据类型
    集合只能存储引用数据类型。如果想存储基本数据类型，需要存储基本数据类型对用的包装器类
   基本类型   类
    byte -> Byte
    short -> Short
    int -> Integer
    long -> Long
    float -> Float
    double -> Double
    char -> Character
    boolean ->Boolean

Java中集合的类型分为两种：
    单列集合
        有序、可重复
        无序、不可重复
    双列集合

Collection集合
    是单列集合的顶层接口，它表示一组对象，这些对象也可以称为Collection的元素
    java中不提供关于Collection集合的任何直接实现类，它提供更具体的子接口的实现类。
    没有关于直接实现Collection集合的实现类，但是有Collection集合子接口(List、Set)的实现类

    如果想要创建Collection集合的对象。
    就需要采用多态的形式，创建Collection集合的实现类对象。比如ArrayList.

    缺少遍历集合的方式
    Collection集合遍历的方式------迭代器
    迭代器是专门用来遍历集合的。
    迭代器是一个类，也是一个方法。
        //1、调用迭代器方法获取迭代器对象
        Iterator it = c.iterator();
        //再通过迭代器对象，调用方法，结合循环，实现遍历。
        //2、直接使用while循环
        //hasNext() 判断当前的位置的元素是否能被取出。   判断什么时候要结束循环
        //next() 获取当前位置的元素，然后将迭代器指向下一个元素位置。
        while (it.hasNext()){
            Object o = it.next();   //获取元素对象，从集合的最开始，获取一个有一个的元素，赋值给o对象
            //至于后面的操作，是输出，还是做运算，都可以.....
            System.out.println(o);
        }
    foreach迭代器
        格式：
            for(元素类型 变量名 : 集合名){
                //使用变量
            }

List集合(还是个接口)
    是一种有序的集合，这里面的有序指的是【存取顺序】
    我们可以精确的控制List集合中每个元素的插入位置，我们可以通过整数索引值来访问元素，并且可以搜索列表中的元素
    List允许放重复元素。
List集合的特点：
    1、存取有序
    2、可以重复
    3、有索引
List常用的方法：  (E 其实是泛型，可以使用任何类型，作用其实是规定要向集合中存取的元素类型)
    add(int index，E element)    在指定位置插入指定的元素
    E remove(int index)     删除集合中指定索引值位置的元素，并且返回被删除的元素
    E set(int index, E element) 修改指定索引位置的元素，返回被修改的元素
    E get(int index)  返回指定索引位置的元素。

List接口是继承于Collection接口的，Collection接口里的方法List也都拥有


1、创建一个学生类，包含id、name、age属性，配置构造方法和setter、getter方法
创建ArrayList集合。
ArrayList<Student> list=new ArrayList<>();
list.add();
向集合中添加5个学生对象
获取索引值为3的学生的姓名
移除集合中索引值为4的学生
遍历集合
清空集合。

2、创建一个教师类，包含id、name、age属性，配置构造方法和setter、getter方法
创建LinkedList集合。
向集合中添加5个教师对象
获取索引值为3的教师的姓名
移除集合中索引值为4的教师
遍历集合
清空集合。
3、创建一个Person类，包含id、name、age属性，配置构造方法和setter、getter方法
创建LinkedList集合。
向集合中添加5个Person对象
获取索引值为3的Person的姓名
移除集合中索引值为4的Person对象
遍历集合
清空集合。

4、创建一个Person类，包含id、name、age属性，配置构造方法和setter、getter方法
创建ArrayList集合。
向集合中添加5个Person对象
获取索引值为3的Person的姓名
移除集合中索引值为4的Person对象
遍历集合
清空集合。



Set集合
    Set集合不能存储重复元素
    Set集合没有索引，不能使用for循环遍历(可以使用foreach)

Set集合也是一种接口，继承Collection集合
Set集合常用的实现类分为：
    HashSet
    TreeSet

HashSet集合
    HashSet集合的底层数据结构是哈希表
    特点存取无序，存入的顺序和取出的顺序不一定一样。
    不能存入重复元素
    没有索引，不能使用for循环遍历
    hashSet集合，其实就是把一个又一个对象进行哈希运算(计算出hash码)后，再根据哈希值的顺序存入到集合中。
    所以，我们存入集合的顺序，和取出元素的顺序是不一致的。

HashCode(哈希值)
    哈希值是JDK根据对象的地址或字符串或者数字进行计算，算出来的int类型的数值。
    如果想获取某个对象的哈希值，可以调用对象.hashCode()方法。就会返回对象的哈希值。
哈希值(哈希码)特点：
    同一个对象多次调用hashCode()方法，返回的hashCode值是相同的。
    默认的情况下，不同的对象的哈希码值是不同的。
    我们重写hashCode()方法的目的就是实现让不同的对象的哈希值相同。

使用HashSet集合存储学生对象并且遍历，
- 创建一个存储学生对象的集合，存储多个学生对象，使用程序实现在控制台遍历该集合
- 要求：学生对象的成员变量值相同，我们就认为是同一个对象

如果要使用HashSet集合存某个类型的对象，那么该类必须要先同时重写equals方法和hashCode方法

TreeSet集合
    不能存储重复元素
    没有索引
    可以将元素按照规则进行排序
    new TreeSet() 无参构造方法 让元素按照自然排序规则进行排序
    new TreeSet(Comparator c) 根据指定的比较器进行排序

注意：
    任何存入TreeSet集合的引用类型对象，都必须要继承Comparable接口，并且重写compareTo方法，设定好两个对象的比较规则(比较大小)

自然排序：自定义类实现Comparable接口，并且重写compareTo方法，根据返回值进行排序
比较器排序：创建TreeSet对象的时候，传递Comparator的实现类对象(匿名内部类、lambda表达式)，
重写compare(o1,o2)方法，然后根据返回值进行排序。

我们在使用TreeSet集合的时候，默认使用的是自然排序，但是当自然排序不能满足我们的业务需求的时候，就必须要使用比较器排序。
两种方式关于返回值的规则：
    如果返回值是负数，表示当前存入的元素是较小值，存左边。
    如果返回值是0，表示当前存入的元素是重复值，不存。
    如果返回值是正数，表示当前存入的元素是较大值，存右边。






