本章内容
-
Comparator比较器
-
Comparable接口
学习目标
- 能够描述Comparable接口和Comparator接口的区别
- 会自定义Comparable接口和Comparator接口比较器中的比较规则
- 能够说出Map集合的特点
- 使用Map集合添加方法保存数据
- 使用键找值,键值对的方法遍历Map集合
- 能够使用HsahMap存储自定义键值对的数据
- 能够使用HashMap编写一些小型案例
Comparator接口比较器
Collections工作集中的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 obj1,Object obj2) 比较两个参数的顺序
两个对象比较的结果有三种:大于 、等于 、小于
如果要按照升序排列:则obj1小于obj2返回(负数),相等返回0,obj1大于obj2返回(正数)
如果要按照降序排列:则obj1小于obj2返回(正数),相等返回0,obj1大于obj2返回(负数)
简化操作:升序:obj1-obj2
降序:obj2-obj1
public static void main(String []args){
//排序规则,按照首字母降序排序
ArrayList<String> list=new ArrayList<>();
list.add("abc");
list.add("cba");
list.add("bca");
list.add("sha");
Collections.sort(list,new Comparator(){
@Override
public int compare(String obj1,String obj2){
return obj2.charAt(0)-obj1.charAt(0);
}
});
Syste.out.println(list);
}
//[sha,cba,bca,abc]
简述Comparable和Comparator两个接口的区别
Comparable:强行对实现它的每个类对象进行整体排序,这种排序我们一般把它称之为自然排序,类的compartorTo方法称之为它的自然比较方法,只能在类中实现一次,不能经常修改类的代码实现自己想要的排序,实现此接口的对象列表和数组可以通过Collections.sort方法和Arrays.sort方法进行自动排序,对象可以作为有序映射中的键或者有序集合当中的元素,无需指定比较器。
Comparator强行对某个对象进行整体排序,可以将Comparator传递给sort方法,如Collections.sort方法或者是Arrays.sort方法从而允许在排序顺序上实现精确控制,还可以使用Comparator来控制某些数据结构,比如说有序的set或者是有序的映射,或者为那些没有自然顺序的对象Collection提供排序
public class Student{
private String name;
private int age;
//getter setter
//无参,全参
//toString
}
public class MainClass{
public static void mian(String []args){
ArrayList<Student> list=new ArrayList<>();
list.add(new Student("tom",20));
list.add(new Student("lily",21));
list.add(new Student("rose",18));
list.add(new Student("jack",99));
list.add(new Student("smith",99));
//按照年龄升序排序
//如果年龄相同,按照姓名首字母降序排序
Collections.sort(list,Comparator(){
@Override
public int compare(Student o1,Student o2){
int num=o1.getAge()-o2.getAge();
if(num==0){
num=02.getName().charAt(0)-01.getName().charAt(0);
}
return num;
}
});
System.out.println(list);
}
}
//[Student("rose",18),Student("tom",20),Student("lily",21),Student("jack",99)]
//[Student("rose",18),Student("tom",20),Student("lily",21),Student("smith",99),Student("jack",99)]
Map集合
概述:现实生活中,我们常会看到这样一种集合 IP地址和主机名,身份证号和个人,系统用户名和系统用户对象。这种关系我么能称之为映射。Java中提供了专门的集合类用来存放这种映射关系的对象。即java.util.Map接口。
Collection接口集合和Map集合存储的方式不一致
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7UtyEes-1607562441086)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1607051463782.png)]
- Collection集合中,元素是孤立存在的,向集合中存储元素采用一个一个元素存储的方式进行存储
- Map集合,元素是一对一对存储的,每一元素由键和值两部分组成,通过键可以找到相应的值
- Collection中的集合我们称之为单列集合,Map中的集合我们称之位双列集合
- 注意:Map集合中不能包含重复的键,但是值可以重复,每一个键对应唯一一个值
Map中的常用子类
通过查看API文档发现有很多个子类,我们主要介绍HashMap、LinkedHsahMap、HashTable集合
- HashMap集合:存储数据采用的是哈希表结构,元素的存取顺序,由于要保证键的唯一性,不重复,需要重写键的HashCode和equals方法
- LinkedHashMap :HashMap下里面的子类LinkedHashMap 存储数据的方式是哈希表结构和链表结构,通过链表的结构可以保证元素的存取顺序一致,通过哈希表结构可以保证键的唯一不重复
Map接口当中,含有两个泛型变量,在使用时要为两个泛型变量指定数据类型,两个泛型变量的数据类型可以相同也可以不同。
Map接口当中常用的API方法 Map<K,V>
如下:
- public V put(K key, V value): 把指定的键与指定的值添加到Map集合当中
- public V remove(Object key): 把指定的键所对应的键值对元素从集合当中删除,返回的是被删除元素的值
- public V get(Object key) 根据指定的键,获得在Map集合当中对应的值
- public Set keySet() 获取Map集合当中所有的key值,存储到Set集合当中
- public Set<Map.Entry<K,V>> entrySet() 获取到Map集合当中的所有键值对对象的集合