Java中的equals(),==,compareTo()和compare()java
- 首先只有==能够用做两个基本类型数据之间的比较,固然是值比较。当用做两个对象比较时,比较的是对象引用,而不是值比较。
- 其次任何对象均可以调用.equals()方法,由于这是从Object类继承下来的。Object.equals(Object obj)的缺省实现也是比较对象引用(显然它不知道如何比较值),但Java类库中的绝大多数类都已覆盖了equals()方法,实现了值比较。固然若是你自定义一个类并且没有覆盖equals()方法,固然比较的仍是对象引用。
- 而后compareTo()方法是Comparable接口惟一须要实现的方法。它的返回值不一样于equals(),返回的是int值-一、0和1,而不是true和false。若是你的自定义类有天然顺序,那么最好也implements这个Comparable接口并实现compartTo()方法。事实上,Java类库中许多类都实现了这个接口,好比:String、Integer、Date、Time等等。
- 最后compare()是Comparator接口的一个方法。最为常见的用法是自定义一个类实现Comparator接口,而后在调用Collection.sort()时做为参数传递。这样能够在compare()方法的实现中指定集合元素的排序规则。
equals与compareTo的分别:this
equals返回true or false。
CompareTo的用法以下:
若是 String str1 = "ddd1 ";
String str2 = "ddd ";
那么,str1.compareTo(str2) 返回的是 1,即str1和str2 的长度差。
若是 String str1 = "ddD ";
String str2 = "ddd ";
那么,str1.compareTo(str2) 返回的是 -32,即str1和str2中 第一个不相等的字符 ‘D’ 和 ‘d’ 的ASCII码的差值。
更详细的,能够去看javadocspa
equals 是比较两个值的大小 并且在不重写的状况下 是比较两个值内容是否相等 ==是判断地址是否相等(好像是这样).net
而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; } } }对象
附其余资料1blog
1、简单类型比较
Java中,比较简单类型变量用“==”,只要两个简单类型值相等即返回ture,不然返回false;
2、引用类型比较
引用类型比较比较变态,能够用“==”,也能够用“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。
3、重写equals()方法
在定义一个类的时候,若是涉及到对象的比较,应该重写equals()方法。重写的通常规则是:
一、先用“==”判断是否相等。
二、判断equals()方法的参数是否为null,若是为null,则返回false;由于当前对象不可能为null,若是为null,则不能调用其equals()方法,不然抛java.lang.NullPointerException异常。
三、当参数不为null,则若是两个对象的运行时类(经过getClass()获取)不相等,返回false,不然继续判断。
四、判断类的成员是否对应相等。往下就随意发挥了。呵呵!
4、总结
“==”比较对象是否引用了同一个对象,或者比较简单类型变量值是否相等。
Object类的equals()方法用来比较是否一个对象(内存地址比较),能够重写。
JDK中有些类重写了equals()方法,只要类型、内容都相同,就认为相等。
很变态的Boolean类,仅存在两个实例。具体可查看API。
通常来讲,一个类若是涉及到比较,应该重写equals()方法,由于内存地址比较没有意义。
转载自:http://blog.csdn.net/emmagood/article/details/7904571排序