Comparable & Comparator

Posted by ZhengYang on 2016-07-22

Comparable & Comparator

Comparable和Comparator都是接口

java.lang.Comparable中只有一个未实现的方法,comparaTo。

1
2
3
public interface Comparable<T> {
public int compareTo(T o);
}

java.util.Comparator中有两个未实现的compare和equals方法,但所有类都会继承Object,而Object类中已经实现了equals方法,所以实现Comparable接口时,只需实现compare方法,而Comparator接口中的equals方法直接被Object中的equals方法实现了。

1
2
3
4
5
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
//...
}

Comparable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;
public class Person implements Comparable<Person>{
String name;
int age;
public Person(String n, int a){
name = n;
age = a;
}
@Override
public int compareTo(Person o) {
int i = 0;
i = name.compareTo(o.name);
if(i==0){
return age - o.age;
}else{
return i;
}
}
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("b",2));
list.add(new Person("a",2));
list.add(new Person("a",1));
Collections.sort(list);
for(Person c: list){
System.out.println(c.name+c.age);
}
// a1
// a2
// b2
}
}

Comparator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Person2 {
String name;
int age;
public Person2(String n, int a){
name = n;
age = a;
}
public static void main(String[] args) {
ArrayList<Person2> list = new ArrayList<Person2>();
list.add(new Person2("b",2));
list.add(new Person2("a",2));
list.add(new Person2("a",1));
Collections.sort(list, new Person2Comparator());
for(Person2 c: list){
System.out.println(c.name+c.age);
}
// a1
// a2
// b2
}
}
// 需要重新写一个类,来实现Comparator接口,并重写compare方法
class Person2Comparator implements Comparator<Person2>{
@Override
public int compare(Person2 one, Person2 two){
int i = 0;
i = one.name.compareTo(two.name);
if(i == 0){
return one.age-two.age;
}else{
return i;
}
}
}

hashMap 和 hashTable 区别

1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.HashMap是非同步的,而hashTable同步的,效率上比hashTable要高。
3.hashMap允许空键值,而hashTable不允许。

1
2
3
4
5
6
7
public class HashMap
extends AbstractMap
implements Map, Cloneable, Serializable {}
public class Hashtable
extends Dictionary
implements Map, Cloneable, java.io.Serializable {}

4.hashMap 在大多数情况下是优先选择的。