Java Comparable接口详解

我们经常听到服务商这样说:”如果类遵从某个特定接口,那么就旅行这项服务“。在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);
	}
	
}

自己实现的执行速度:

调用封装类:

 

猜你喜欢

转载自blog.csdn.net/qq_39429962/article/details/84945232