Java中的equals,==,compareTo和compare的⽐较
Java中的equals(),==,compareTo()和compare()
1. ⾸先只有==可以⽤作两个基本类型数据之间的⽐较,当然是值⽐较。当⽤作两个对象⽐较时,⽐较的是对象引⽤,⽽不是值⽐较。
2. 其次任何对象都可以调⽤.equals()⽅法,因为这是从Object类继承下来的。Object.equals(Object obj)的缺省实现也是⽐较对象引⽤
(显然它不知道如何⽐较值),但Java类库中的绝⼤多数类都已覆盖了equals()⽅法,实现了值⽐较。当然如果你⾃定义⼀个类⽽且没有覆盖equals()⽅法,当然⽐较的还是对象引⽤。
3. 然后compareTo()⽅法是Comparable接⼝唯⼀需要实现的⽅法。它的返回值不同于equals(),返回的是int值-1、0和1,⽽不是true和
false。如果你的⾃定义类有⾃然顺序,那么最好也implements这个Comparable接⼝并实现compartTo()⽅法。事实上,Java类库中许多类都实现了这个接⼝,⽐如:String、Integer、Date、Time等等。
4. 最后compare()是Comparator接⼝的⼀个⽅法。最为常见的⽤法是⾃定义⼀个类实现Comparator接⼝,然后在调⽤Collection.sort()时
作为参数传递。这样可以在compare()⽅法的实现中指定集合元素的排序规则。
equals与compareTo的分别:
java的tostring方法equals返回true or false。
CompareTo的⽤法如下:
如果 String str1 = "ddd1 ";
String str2 = "ddd ";
那么,str1pareTo(str2) 返回的是 1,即str1和str2 的长度差。
如果 String str1 = "ddD ";
String str2 = "ddd ";
那么,str1pareTo(str2) 返回的是 -32,即str1和str2中第⼀个不相等的字符 ‘D’ 和 ‘d’ 的ASCII码的差值。
更详细的,可以去看javadoc
equals 是⽐较两个值的⼤⼩⽽且在不重写的情况下是⽐较两个值内容是否相等 ==是判断地址是否相等(好像是这样)
⽽compare to⼀般⽤来⽐较引⽤的对象的值⽽且可以被重写 Java compareTo作⽤是对⼀个类中的属性以⼀定的⽅式进⾏组织,写好了可以让数据更有序./** * 实现Comparable接⼝,重写compareTo⽅法,返回值1,0,-1 * 覆写compareTo⽅法就是重建排序规则 */ public int compareTo(Object obj) { Person p = (Person) obj; if (p.score > this.score) { return 1; } else if (p.score < this.score) { return -1; } else { // 如果成绩相等则判断年龄 if (p.age > this.age) { return 1; } else if (p.age < this.age) { return -1; } else { return 0; } } }
附其他资料1
⼀、简单类型⽐较
Java中,⽐较简单类型变量⽤“==”,只要两个简单类型值相等即返回ture,否则返回false;
⼆、引⽤类型⽐较
引⽤类型⽐较⽐较变态,可以⽤“==”,也可以⽤“equals()”来⽐较,equals()⽅法来⾃于Object类,每个⾃定义的类都可以重写这个⽅法。Object类中的equals()⽅法仅仅通过“==”来⽐较两个对象是否相等。
在⽤“==”⽐较引⽤类型时,仅当两个应⽤变量的对象指向同⼀个对象时,才返回ture。⾔外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有⾃⼰的⼀块内存,因此必须指向同⼀个对象才返回ture。
在⽤“equals()”⽐较引⽤类型时,情况就⽐较复杂,甚⾄有些变态,容易掉进陷阱。
在Java API中,有些类重写了equals()⽅法,它们的⽐较规则是:当且仅当该equals⽅法参数不是 null,两个变量的类型、内容都相同,则⽐较结果为true。这些类包括:String、Double、Float、Long、Integer、Short、Byte、、Boolean、BigDecimal、BigInteger等等,太多太多了,但是常见的就这些了,具体可以查看API中类的equals()⽅法,就知道了。
解析变态的Boolean类:在这些类中,最最变态的是要数Boolean类了,我感觉是开发Boolean类的⼈员头脑进⽔了。我也不想细说了,你有好四中⽅式来创建⼀个Boolean对象(两构造⽅法,两个静态⽅法valueOf(),推荐⽤静态⽅法)。
Boolean类的变态之处不在于其equals()⽅法。⽽是在于Boolean对象创建⽅法。其实Boolean类的对象最多有两个,其toString()值分别是true和false。当且仅当⽤true或者"true"创建的Boolean类为同⼀个对象且toString()值为true。其他的字符串或者false创建的Boolean对象的值⼀律相等且toString()值为false。
三、重写equals()⽅法
在定义⼀个类的时候,如果涉及到对象的⽐较,应该重写equals()⽅法。重写的⼀般规则是:
1、先⽤“==”判断是否相等。
2、判断equals()⽅法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调⽤其equals()⽅法,否则抛java.lang.NullPointerException异常。
3、当参数不为null,则如果两个对象的运⾏时类(通过getClass()获取)不相等,返回false,否则继续判断。
4、判断类的成员是否对应相等。往下就随意发挥了。呵呵!
四、总结
“==”⽐较对象是否引⽤了同⼀个对象,或者⽐较简单类型变量值是否相等。
Object类的equals()⽅法⽤来⽐较是否⼀个对象(内存地址⽐较),可以重写。
JDK中有些类重写了equals()⽅法,只要类型、内容都相同,就认为相等。
很变态的Boolean类,仅存在两个实例。具体可查看API。
⼀般来说,⼀个类如果涉及到⽐较,应该重写equals()⽅法,因为内存地址⽐较没有意义。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论