你可能只知道Array.sort()可以排序,却不知道为什么可以用它排序
在平常用到数组或者字符串数组排序时,首先想到的就是使用Arrays.sort()进行排序,方便好用:
import java.util.Arrays;
public class demo {
public static void main(String[] args) {
Integer a[]={1,2,0,4,5,8,9,3};
String b[]={"a","d","w","b"};
Arrays.sort(a);
for (int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
}
}
输出的就是排序后的a,b数组
0 1 2 3 4 5 8 9
a b d w
Process finished with exit code 0
我们进入Integer和String的源码可以看到它们都实现了Comparable
接口,写了compareTo
方法
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc{
......
public int compareTo(){
...
}
}
public final class Integer extends Number
implements Comparable<Integer>, Constable, ConstantDesc{
...
public int compareTo() {
...
}
}
这里就联想到平时给自定义类排序时也是实现comparable接口,再重写compareTo方法,可以验证一下:
import java.util.Arrays;
public class demo {
public static void main(String[] args) {
Money m1=new Money(100,"小王");
Money m2=new Money(10012,"小张");
Money m3=new Money(130,"小赵");
Money m[]={m1,m2,m3};
Arrays.sort(m);
for (int i=0;i<m.length;i++)
System.out.print(m[i].getName()+" ");
}
}
class Money implements Comparable<Money>{
private int num;
private String name;
public Money(int num,String name){
this.name=name;
this.num=num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Money o) {
return o.num-this.num;
}
}
这个Money类存储了每个人的姓名和存款,排完序之后输出名字为:
小张 小赵 小王
Process finished with exit code 0
这是从大到小降序排,想要升序排只需要把Money类中的compareTo方法相减的调换一下即可。
以上是对自定义类的sort,但是类实现的comparable接口只是实现了 为什么可以用Arrays.sort()排序,至于“Arrays.sort()为什么可以排序”这个问题还是得回到最终的sort源码里,这个理解难度比较大,下次再另开新文章好好说说