目录
一.比较是否相等
1.双等号"=="
用来比较内存中的地址是否相等
不同对象的内存地址一定不相等。(new出来的两个对象)
2.equals()
默认也使用“==”来比较,如果要判断两个对象内容是否相等,需要重写equals()方法。
重写equals()方法步骤:1.判断是否为空
2.判断类型是否相等
3.比较每个属性的值是否相等
二.比较大小
一般对象用大于小于比较时,编译不通过。
==可以比较的原因是:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址。
1.comparble接口
每一个实体类都可以继承,实现比较方法comparaTo()方法。
注:该接口只能比较一个属性,若小于,结果为负数;相等时结果为0;大于时结果为正数。最后是以升序排列方式输出。
2.比较器comparator接口
该种接口可以定义很多比较规则,根据具体业务场景做选择。(需要建立多个比较器)
注:string类型本身实现了comparable接口,可直接放入优先级队列中。除了string类型,还有Number的子类double、char等都可以放入优先级队列中。
3.三种方式对比
覆写的方法 说明
Object.equals 因为所有类都是继承自 Object 类,所以直接覆写即可,不过只 能比较相等与否
Comparable.compareTo 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类 都有顺序,属于内部顺序
Comparator.compare 需要实现一个比较器对象,对待比较类的侵入性弱,但对算法 代码实现侵入性强
4. 集合框架中PriorityQueue的比较方式
集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小,PriorityQueue采用了:Comparble和Comparator两种方式。