误区1-java中equals与==比较
近来编程学习过程中,发现某一些常识性的知识或问题,因我们治学态度不严谨或想当然的学习方式,而常常产生错误的理解。特将工作学习过程中,发现或遇到的一些问题记录如下。
误区:equals比较内容,==比较引用。
java中,“equals比较内容,==比较引用”的认识,非常普遍。然而,只需自行测试即可发现该观点的不正确。
public static void main(String[] args) {
TestEquals testEquals = new TestEquals();
testEquals.testFunc();
}
private void testFunc() {
class TestItem {
int value;
public TestItem(int i) {
// TODO Auto-generated constructor stub
value = i;
}
/*public boolean equals(Object item) {
System.out.println("TestItem equals");
return this.value == ((TestItem)item).value;
}*/
}
TestItem item1 = new TestItem(1);
TestItem item2 = new TestItem(1);
testCompareFunc(item1, item2);
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
testCompareFunc(int1, int2);
}
/**
* 测试比较两个元素
* @param <T>
* @param item1
* @param item2
*/
public static <T> void testCompareFunc(T item1, T item2) {
if ( item1.equals(item2) ) {
System.out.println("item1.equals(item2)=true");
} else {
System.out.println("item1.equals(item2)=fale");
}
if ( item1 == item2 ) {
System.out.println("item1 == item2=true");
} else {
System.out.println("item1 == item2=fale");
}
System.out.println("=============================================");
}
上述测试代码,输出结果为:
item1.equals(item2)=fale
item1 == item2=fale
=============================================
item1.equals(item2)=true
item1 == item2=fale
=============================================
若打开TestItem的equals重载方法,则输出结果为:
TestItem equals
item1.equals(item2)=true
item1 == item2=fale
=============================================
item1.equals(item2)=true
item1 == item2=fale
=============================================
“==”比较的是一个对象的内存地址,即,是否是同一份内存数据,在java调试过程中,可通过观察对象的内存地址是否相等或直接查看对象产生的hashcode是否相等来进行判断。
而equals,作为Object类中可以被重载的函数,它的使用,只依赖于所使用的那个类是如何实现重写该方法的。根据需要,可以自行实现为比较对象内的内容值是否相同,如基本对象类型Integr,又可实现为直接比较对象的内存地址,甚至结合二者的比较形式,例如,String、Float等类型的实现,均为首先直接比较对象的内存地址,若不等,则再进行比较内容值,再行返回结果。因为java中所有的类都默认继承于Object,因此若某类没有自行重载该方法,则默认使用Object的equals方法,而Object的equals方法,是直接比较对象的内存地址。
因此,==比较引用,但equals的比较方式,取决于类是否重载该方法,若未重载,则与==的比较方式相同。
浙公网安备 33010602011771号