今日内容:
    Comparator比较器
    Comparable接口
    Map集合
学习目标:
    能能够描述Comparable接口和Comparator接口的区别
    会自定义Comparable接口和Comparator接口比较器中的规则
    能够说出Map集合的特点
    使用Map集合添加方法保存数据
    使用“键找值”的方式遍历Map集合
    使用“键值对”的方式遍历Map集合
    能够使用HashMap存储自定义键值对的数据
    能够使用HashMap编写一些小型案例
    
    Comparator接口比较器
    
        Conllections工具集中的sort()

public static <T> void sort(List<T> list);
        public static <T> void sort(List<T> list,Comparator<? Super T> c);

       Comparator接口在java.util包下面,排序是Comparator需要实现的功能之一,该接口代表的是一个比较器,比较器具有可比性,可以做
           排序,其实是比较两个对象谁排在前面谁排在后面。那么比较的方法是:
           
        public int compare(Object o1,Object o2);比较两个参数的顺序
            如果两个对象比较结果有三种:大于,等于,小于
            如果按照升序排序:则o1小于o2返回(负数),相等返回(0),o1大于o2返回(正数)
            如果按照降序排序:则o1小于o2返回(正数),相等返回(0),o1大于o2返回(负数)
            简化操作:
               升序排序:o1-o2

               降序排序:o2-o1

public static void main(String[] args){
                //public static <T> void sort(List<T> list);
                ArrayList<String> list = new ArrayList<>();
                list.add("abc");
                list.add("cba");
                list.add("bca");
                list.add("sba");
                list.add("nba");
                //排序规则,按照字符串第一个字母降序排序
                //使用接口中的方法: 
                //public static <T> void sort(List<T> list,Comparator<? Super T> c);
                Collections.sort(list,new Comprator(){
                    @Override
                    public int compare(String o1,String o2){
                        /*if(o2.charAt(0)-o1.charAt(0)>0){
                            return 1;
                        }else if (o2.charAt(0)-o1.charAt(0) == 0){
                            return 0;
                        }else{
                            return 1;
                        }*/
                    
                        return o2.charAt(0)-o1.charAt(0);
                    }
                });
                System.out.println(list);
            }

        //不变的  类要实现 固定的
        Comparable:强行对实现他的每个类对象进行整体排序.这种排序我们一般把他称之为自然排序,
            类的compareTo方法被称之为自然比较方法.只能在类中实现compareTo方法一次.
            不能经常修改类的代码实现自己想要的排序.实现此接口的对象列表(和数组)可以通过Collections.sort()(和Arrays.sort())
            进行自动排序,对象可以用作有序映射中的键或者有序集合中的元素,无需指定比较器。
        //经常需要变 匿名内部类 灵活的
        Comparator:强行对某个对象进行整体排序。可以将Comparator传递给sort()方法(如Collections.sort()后者Arrays.sort())
            从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(有序的set或者是有序的映射)的顺序
            或者为那些没有自然顺序的对象Collection提供排序。
            public class Student{
                private String name;
                private int age;
                //get和set
                //toString方法
                //无参全参构造
            }
            public class MainClass{
                public static void main(String[] args){
                    //假如学生都是老外 名字都是字母
                    ArrayList<Student> list = new ArrayList<>();
                    list.add(new Student("tom",20));
                    list.add(new Student("lily",18));
                    list.add(new Student("jack",26));
                    list.add(new Student("rose",40));
                    list.add(new Student("smith",26));
                    
                    
                    //按照年龄升序排序
                    //如果年龄相同的话,然后按照姓名排序,按照首字母降序排序
                    Collections.sort(list, new Comparator<Student>(){
                        @Override
                        public int compare(Student o1,Student o2){
                            int num = o1.getAge()-o2.getAge();
                            if(num == 0){
                                num = o2.getName().charAt(0) - o1.getName().charAt(0);
                            }
                            return num;
                        }
                    });
                    System.out.println(list);
                }
            }
            //输出结果
            [l18,t20,j26,r40]
            //二次控制台输出结果
            [l18,t20,s26,j26,r40]

    Map集合
    概述:
        现实生活中,我们常会看到这样一种集合:IP地址和主机名,身份证号和个人,系统用户名与系统用户对象等,
            这种是一一对应关系,我们把它称之为映射。在java当中提供了专门的集合类用来存放这种映射关系的对象。
            即java.util.Map接口
        
    Collection中的集合,元素是孤立存在的(单身),向集合中存储元素采用一个一个元素存储的方式进行存储
    Map中的集合,元素是成对存在(夫妻),每个元素有键和值两部分组成。我们可以通过键找到对应的值
    Collection中的集合,我们称之为单列集合,Map集合我们称之为双列集合
    注意:Map中的集合不能包含重复的键,值可以重复,每个键对应唯一一个值。
    
    
    Map中的常用子类:
        通过查看API帮助文档我们发现有很多个子类,我们主要介绍HashMap集合、LinkedHashMap集合、HashTable集合(了解)
        HashMap:存储数据结构采用的哈希表结构,元素的存取顺序可以不一致,由于要保证键的唯一性,不重复,
            需要重写键的hashCode方法和equals方法
            
        LinkedHashMap:HashMap下面有个子类LinkedHashMap,存储数据的方式也是采用哈希表+链表结构,可以通过链表结构
            保证元素的存取顺序一致;通过哈希表结构可以保证键的唯一不重复,需要重写键的hashCode方法和equals方法
            
        备注:Map接口当中,含有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型,两个泛型变量的数据类型可以相同
            也可以不同.                    
        Map接口当中的常用API方法:Map<K,V>
            常用方法如下:           

public V put(K key,V value);把指定的键与指定的值添加到Map集合当中
                public V remove(Object key);把指定的键所对应的键值对元素从Map集合中删除,返回的是被删除元素的值
                public V get(Object key);根据指定的键 获得在Map集合中对应的值
                public Set<K> keySet();获取Map集合当中所有的key值,存储到Set集合当中
                public Set<Map.Entry<K,V>>entrySet();获取到Map集合当中的所有的键值对对象集合(Set集合)
                    Map.Entry<K,V>;在Map接口有一个内部接口Entry

                    作用:当Map集合一创建,紧接着就在Map集合中创建一个Entry对象
                    用来及Map中的键与值(键值对对象,键与值是映射关系)