Comparable和Comparator比较
- Comparable是lang包下的,内比较器,一般编写bean对象的时候实现。类需要实现该接口才可以进行比较,耦合性高,使用compareTo(obj)方法进行比较。
- Comparator是util包下的,外比较器,如果想要比较某个类,只需重写compare(obj1,obj2)方法即可进行比较。
Comparable使用:
public class LFUCache {
// 每个节点包含key,value,使用频率freq以及版本号idex,越早放入版本号越小
// 实现Comparable接口,重写compareTo方法使Node可比较
static class Node implements Comparable<Node> {
int key;
int value;
int freq;
int idx;
public Node(int key, int value, int idx) {
this.key = key;
this.value = value;
freq = 1;
this.idx = idx;
}
@Override
public int compareTo(Node node) {
// 升序
int diff = freq - node.freq;
return diff != 0 ? diff : idx - node.idx;
}
}
}
Comparator在Java集合中自定义排序策略:
// 优先队列
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){
@Override
// 升序排列,可以理解为o2是新添加的数,o2大于o1时返回负数代表不用排序直接入队
// o2小于o1时返回正数需要重新排序入队
public int compare(Integer o1, Integer o2){
return o1-o2;
}
}
// 集合工具类排序
Collections.sort(arrayList, new Comparator<String>() {
@Override
// o1小于o2返回-1表示false不用重新排序,默认升序
public int compare(String o1, String o2) {
if(o1.compareTo(o2) < 0 ){
return -1;
}else if(o1.compareTo(o2) == 0){
return 0;
}else{
return 1;
}
}
});