java compareable接口_java的Comparable接口详解

背景

我们在字符串中见到过CompareTo方法,知道这个方法是用于比较字符串顺序的,根据字典顺序进行排序。Java中很多类也都有CompareTo方法,甚至于排序算法的底层组成也是依赖于比较的,而这个比较就是依赖于各种数据类型的CompareTo或者Compare方法。Java中所有的compareTo方法都源于一个共同的接口,那就是Comparable。这个接口只有一个方法,那就是CompareTo。所有想要具有比较功能的类,都建议实现这个接口,而非是自己定义这个功能,这是面向对象的概念(将具有相同功能的事物抽象到一个共同的类或接口),并且为了多态也建议通过实现接口来进行向上转型,通过接口来操作具体实现,这也是面向接口编程要求我们做的。下面我们来具体了解一下Comparable接口。

Comparable接口位于:java.lang包中。实现了这个接口的类,会被强制进行自然排序(字典排序)

查看源码

public interface Comparable {

public int compareTo(T o);

}

compareTo(T o) 比较此对象与指定对象的顺序。O为要比较的对象

如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。 根据不同类的实现返回不同,大部分返回1,0和-1三个数

例如:假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。

看一下java中String和Integer对于compareTo()的实现:

private final char value[];//String的底层是字符数组  a.compareTo(b)

public int compareTo(String anotherString) {

int len1 = value.length;//获取调用该方法的字符串的长度a

int len2 = anotherString.value.length;//获取比较字符串的长度b

int lim = Math.min(len1, len2);//(a <= b) ? a : b;  min底层代码  这句代码是为了获取较短的字符串的长度

char v1[] = value;  //创建两个字符数组,分别指向这两个字符串的所在

char v2[] = anotherString.value;

//循环比较,循环次数,是较短的字符串的长度,如果用较长的字符串的长度,那么会出现nullPointException

int k = 0;

while (k < lim) {

char c1 = v1[k];

char c2 = v2[k];

//比较相对应索引的元素,如果元素不同则比较返回中间差距的顺序,如果相等,那么就继续循环比较

if (c1 != c2) {

return c1 - c2;//字符对应的Unicode码表中的数字,这也就是为什么说String是按照字典书序比较的,如a比b靠前,那么a对应的数字比b小,相减返回负数,差多少顺序,就返回多少

}

k++;

}

//如果两个字符串的长度不同,其它都相同,那么返回的就是长度的差距了

return len1 - len2;

}

我们可以看到String对于compareTo的实现就是依据Unicode码表中字符对应的数字来判断的,返回的是字符串长度差或者是字符间在码表上的差距,依据具体情况,返回也不同.下面我们看看Integer的compareTo():

//Integer的compareTo方法,底层依据的是compare方法,这个方法是Comparator接口的一个方法

public int compareTo(Integer anotherInteger) {

//实际上Integer的比较是通过Integer中包括的整数来比较的

return compare(this.value, anotherInteger.value);

}

public static int compare(int x, int y) {//a.compateTo(b)

//如果a比b小,那么返回-1,相等就是0,否则就是1

return (x < y) ? -1 : ((x == y) ? 0 : 1);

}

Java中除了提供一个比较方法的接口外,还提供了一个比较器的接口Comparator,下节我们来读一下Comparator。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Comparable接口定义了一个compareTo方法,用于比较类的对象之间的大小关系。实现Comparable接口的类可以使用Arrays.sort()和Collections.sort()进行排序。 实现Comparable接口的类需要重写compareTo方法,该方法返回一个整数值,表示当前对象与另一个对象的大小关系。如果当前对象小于另一个对象,则返回负整数;如果当前对象等于另一个对象,则返回0;如果当前对象大于另一个对象,则返回正整数。 以下是一个示例实现Comparable接口的类: ``` public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Person o) { return this.age - o.getAge(); } } ``` 在上面的示例中,Person类实现了Comparable接口,并重写了compareTo方法。该方法比较两个Person对象的年龄大小关系。 如果要对Person对象进行排序,可以使用Arrays.sort()或Collections.sort()方法。例如: ``` Person[] persons = new Person[] { new Person("Tom", 25), new Person("Jack", 18), new Person("Mary", 30) }; Arrays.sort(persons); for (Person person : persons) { System.out.println(person.getName() + " " + person.getAge()); } ``` 该示例中,使用Arrays.sort()对Person对象数组进行排序,按照年龄从小到大排序。最后输出排序后的结果。 需要注意的是,实现Comparable接口的类必须能够比较大小,否则可能会抛出ClassCastException异常。因此,在重写compareTo方法时,应该考虑到类的属性是否可以比较大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值