- 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
接口
特点:
- 键唯一
- 键和值是一一映射的,一个键对应一个值
- 靠键维护他们的关系
- 值可以不唯一
- key键可以没有,value也可以没有,key和value同时都没有(null)
- 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中的键值对