我们经常听到服务商这样说:”如果类遵从某个特定接口,那么就旅行这项服务“。在Java中Comparable接口就是这个特定的接口,Arrays类的sort方法承诺可以对对象数组进行排序,但前提是:对象所属的类必须实现了Comparable接口(几大基本类型除外)。但是,我们有两种选择:
1、自己实现Comparable接口
@Override
public int compareTo(Car o) {
if(speed < o.speed)
return -1;
return 0;
}
2、调用一些封装类的Comparable接口
@Override
public int compareTo(Car o) {
if(speed < o.speed)
return -1;
return Integer.compare(this.speed, o.speed);
}
他们的区别在于,自己实现的方法会一针见血的去执行我们想要的目的,官方给出的封装类的实现方法,由于要达到通用的效果会做很多检验,并且会开启额外的栈帧,根本没有自己实现的方法执行的快,请看如下代码,执行速度差了4~5倍。
package test1;
import java.util.Arrays;
import java.util.Date;
public class Car implements Comparable<Car>{
private String name;
private int speed;
@Override
public int compareTo(Car o) {
// TODO Auto-generated method stub
if(speed < o.speed)
return -1;
// return Integer.compare(this.speed, o.speed);
return 0;
}
public Car(String name , int speed){
this.name = name;
this.speed = speed;
}
public static void main(String[] args) {
int n = 200000;
Object[] list = new Object[n];
for(int i = 0; i < n; i++){
list[i] = new Car(String.valueOf(i),(int)(Math.random()*100000));
}
long b = System.currentTimeMillis();
System.out.println(System.currentTimeMillis());
Arrays.sort(list);
long c = System.currentTimeMillis();
System.out.println(System.currentTimeMillis());
System.out.println(c - b);
// for(Object c1 : list)
// System.out.println(((Car)c1).name+"::::::::::::::"+((Car)c1).speed);
}
}
自己实现的执行速度:
调用封装类: