浅谈java中的比较机制

版权声明:欢迎转载,共同进步,麻烦注明转载出处 https://blog.csdn.net/Hanxiaofan95/article/details/83753201

对于编程语言来说,比较机制是核心机制之一,因为平时内置的比较机制,导致我对这个知识点没有啥概念,总觉得他们本来就可以比较,最近在看Java容器的时候,发现原来Java做的封装太好了,导致我们平时一般是不会接触到这点。废话不多说,来看下Java中的比较机制。
1:comparable接口
对于常见的类,大多数已经默认实现了该接口,而且这个接口就是Java比较机制的核心。来看下官方文档的说明:
This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class’s natural ordering, and the class’s compareTo method is referred to as its natural comparison method.

Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort). Objects that implement this interface can be used as keys in a sorted map or as elements in a sorted set, without the need to specify a comparator.

The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C. Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.
因为有点长,我就总结下,就是只要类实现了comparable接口,那个这个类就可以被Collections和Arrays这样的工具类自动排序,它的比较的原理是调用该接口中的compareTo()方法,该方法会根据比较的结果返回一个正整数,0,或者是一个负数,分别表示大于,等于和小于三种结果。当我们实现comparable接口的时候,需要重写compareTo()方法。
java中的自然排序就是指按照comparable中的方法进行的排序。
2:comparator接口:
comparator接口是java外置的一个比较器,它用于那些无法进行自我比较的对象或者是本身的比较方式无法完全满足比较要求的对象。

int 	compare(T o1, T o2)  
boolean equals(Object obj)  

这是该接口中的两个方法,comparator比较器调用compare()来进行比较,调用equals)()方法来判断相等。对于comparator比较器而言,它体现了java在不改变原来对象的情况下,通过策略模式的手段,改变了相应对象行为的一种方式。因此,实现comparator接口的时候,需要实现compare()方法。
说到了比较的问题,那就必须要说说java中经常会问道的一个老问题,equals()方法和==的区别。equals()是在Object类中定义的一个方法,也就是说,即使我们的类中没有显式的定义该方法,但是我们的类已经从Object类中继承了该方法。我们来看看该方法的源码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

我们可以看到,在equals()方法的底层,直接返回了this == obj的结果。我们知道,java中 = =的比较方式是比较两个对象的地址,如果两个地址是同一个地址,那么返回的结果为true,否则就是为false,这也是我们经常面试笔试会问到的一个问题。但是,我们仍然是可以自定义equals()方法,使得按照我们的需求来判断两个对象是否是相等。就比如说,有两个人,他们的名字和家庭地址都是一样的,那么我们就认为这两个人是同一个人(这个例子有点傻逼,但是道理有了就可以)。很多方法都会重写equals()方法,具体的类要具体分析。不过只要知道了这个知识点,理解起来就没有那么难了。
若有错误,请多担待,后面还会持续的修改和补充。

猜你喜欢

转载自blog.csdn.net/Hanxiaofan95/article/details/83753201
今日推荐