Java中Comparable讲解
Comparable是排序接⼝;若⼀个类实现了Comparable接⼝,就意味着“该类⽀持排序”。可以使⽤Arrays.sort()对改类进⾏排序。
讲解
1.Comparable接⼝
使⽤场景:假如说我们有这样⼀个需求,需要设计⼀个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的⼤⼩进⾏排序,那么实现可以这样
package com.ikos.web;
import java.util.Arrays;
class Person implements Comparable<Person>{
int age;
String name;
public Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return"姓名:"+name+","+"年龄:"+age+";";
}
@Override
public int compareTo(Person o) {
/
/ TODO Auto-generated method stub
if(this.age>o.age){
return1;
}else if(this.age<o.age){
return -1;
}
//当然也可以这样实现
// return Integerpare(this.age, o.age);
return0;
}
public static void main(String[] args) {
Person []persons = new Person[]{
new Person("张三",15),
new Person("李四",25),
new Person("王五",20)
};
Arrays.sort(persons);
System.out.String(persons));
System.out.println(persons[0]==persons[1]);
System.out.println(persons[0].equals(persons[1]));
}
}
结果:
注意细节:
Comparable<T>接⼝⾥⾯有⼀个泛型T,T的选择为可以与之⽐较的对象的类型,⼀般就是实现该接⼝类的本⾝,可以这样想和Person类⽐较的当然是Person本⾝了。
Comparable<T>只是在Arrays⾥⾯起作⽤,其他地⽅⽬前我并没有发现什么作⽤,包括运算符和equals上,这个接⼝也不起什么作⽤
2.Comparator接⼝
Comparator也是⼀个⽐较器,但是属于挽救设计的⼀种,⼀般来说尽量减少。
下⾯的例⼦演⽰了Comparator泛型的使⽤"extends"如何使⽤在⼀般意义上的意思"extends"(类)或者"implements"(接⼝)。该例⼦中的泛型⽅法返回三个可⽐较对象的最⼤值。
package com.ikos.web;
import java.util.Arrays;
printf输出格式java
class Person  {
// ⽐较三个值并返回最⼤值
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // 假设x是初始最⼤值
if ( ypareTo( max ) > 0 ){
max = y; //y 更⼤
}
if ( zpareTo( max ) > 0 ){
max = z; // 现在 z 更⼤
}
return max; // 返回最⼤对象
}
public static void main(String[] args) {
System.out.printf( "%d, %d 和 %d 中最⼤的数为 %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "%s, %s 和 %s 中最⼤的数为 %s\n","abc",
"zabc", "orange", maximum( "abc", "zabc", "orange" ) );
}
}
结果输出:
3, 4 和 5 中最⼤的数为 5
abc, zabc 和 orange 中最⼤的数为 zabc
总结
Comparable和Comparator的区别:
java.lang.Comparable:在类定义的时候,可以实现好的接⼝,⾥⾯有compareTo这个⽅法需要实现。
java.util.Comparator:是挽救的⽐较接⼝,需要单独定义⼀个⽐较类,⾥⾯有compare⽐较⽅法。
在更多情况下我们使⽤⽐较多的还是Comparable接⼝,在实际开发过程中的话,其实两者使⽤都⽐较少。