day20_比较器&Map

  • Comparator比较器
  • Comparable接口
  • Map集合

Comparable接口

​ 调用Collections.sort()方法的类必须实现 Comparable接口,我们可以通过重写compareTo方法来实现功能

Comparator接口比较器

Collections工具集中的sort()
public static <T> void sort(List<T> list)//实现了Comparable接口
public static <T> void sort(List<T> list,Comparator<? super T> c)//实现Comparator,可以自定义排序规则

​ 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){
    ArrayList<String > list = new ArrayList();
    list.add("abc");
    list.add("cbd");
    list.add("sba");
    list.add("nba");
    //排序规则,按照字符串第一个字母降序排序     需要自定义规则
    //public static <T> void sort(List<T> list,Comparator<? super T> c)
    Collections.sort(list,new Comparator(){//接口的匿名实现类
        @Override
        public int compare(String o1,String o2){
            /*if(o2.charAt(0) - o1.charAt(0)){
            	return 1;
        	}else if(o2.charAt(0) == o1.charAt(0)){
        		return 0;
        	}else{
        		return -1;
        	}*/
            return o2.charAt(0) - o1.charAt(0);
        }
    });
    System.out.println(list);//[sba,nba,cbd,abc]
}

简述Comparable和Comparator接口的区别

  • ​ Comparable:强行对实现它的每个类对象进行整体排序。称为类的自然排序。该类的compareTo方法被称之为它的自然比较方法,只能在类中实现compareTo方法一次。不能经常二次修改类的代码实现自己想要的排序。实现此接口的对象列表(或数组)可以通过Collections.sort() 和Arrays.sort() 进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定 Comparator 比较器
  • ​ Comparator:强行对某个对象进行整体排序,可以将Comparator传递给sort() 方法(如Collections.sort() 和Arrays.sort() )从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(有序的Set或者有序的映射)的顺序,或者为那些没有自然顺序的对象集合提高排序
  • ​ Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。comparable是需要比较的对象来实现接口。这样对象调用实现的方法来比较。对对象的耦合度高(需要改变对象的内部结构,破坏性大)。Comparator相当于一通用的比较工具类接口。需要定制一个比较类去实现它,重写里面的compare方法,方法的参数即是需要比较的对象。对象不用做任何改变。解耦。
public class Student{
    private String name;
    private int age;
    //JavaBean所需全部结构...
}
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",29));
        list.add(new Student("Bob",28));
        list.add(new Student("Jack",24));
        list.add(new Student("Smith",24));
        //按照年龄升序排序
        //如果年龄相同的话,按照姓名首字母降序排序
        Collections.sort(list,new Comparator<Student>(){
            @Override
        	public int compare(Student o1,Student o2){ //嵌套排序
            	int oj = o1.getAge() - o2.getAge()
                if(oj == 0){
                    oj = o2.getName.charAt(0) - o1.getName.charAt(0);
                }    
                return oj;
        	}
        });
        System.out.println(list);//[ 按年龄(姓名首字母)排序 ]
    }
}

Map集合

​ Map中key于value是一一对应的映射关系,Java当中提供专门的集合类用来存放这种映射关系java.util.Map接口

​ 特点:

  1. ​ 键唯一
  2. ​ 键和值是一一映射的,一个键对应一个值
  3. ​ 靠键维护他们的关系
  4. ​ 值可以不唯一
  5. ​ key键可以没有,value也可以没有,key和value同时都没有(null)
  6. ​ key只能存储一次null值
  • Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个一个元素存储的方式进行存储。
  • Map中的集合,元素是成对存在的,每个元素由键和值两部分组成,通过键可以找到对应的值
  • Collection中的集合,一般称之为单列集合;Map中的集合,称之为双列集合
  • 注意:Map中的集合不能包含重复的键,值可以重复,每个键对应唯一一个值

键对值 一对一

值对键 一对多

Map中的常用子类

​ 子类很多,重点介绍HashMap、LinkedHashMap、HashTable集合

​ HashMap:存储数据采用哈希表结构,元素的存取顺序可能不一致,由于要保证键的唯一性,不重复,需要重写键的hashCode方法和equals方法

​ LinkedHashMap:HashMap下的一个子类,存储数据的方式也是采用哈希表 + 链表结构,可以通过链表结构保证元素的存取顺序一致 ;通过哈希表结构保证键的唯一不重复

备注:Map接口中,有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型,两个泛型变量的数据类型可以相同,也可以不同

Map接口当中的常用方法:

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

Map中的Entry

​ 在Map接口中有一个内部接口Entry

作用:当Map接口集合创建时,紧接着就会在Map集合中创建一个Entry(键值对对象)对象,用来记录Map中的键值对

原文地址:https://www.cnblogs.com/mitoris/p/14088128.html