在JAVA中“==”对于基本数据类型来说,比较的是值的大小是否相同;但对于对象来说,比较的却是对象的句柄,而并非对象的内容,所以如下代码:
import java.util.*;
public class Project4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer n1 = new Integer(49);
Integer n2 = new Integer(49);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
}
很多人按照常理来说都会认为输出的是true和false,但是答案却是相反的,正确输出结果为:
原因就是“==”比较的是对象的句柄,尽管n1和n2对象的值相同,但创建对象时的句柄不同,则判断为false。那么该如何比较对象中的内容的值呢?需要用到对象的通用方法equlas()方法,所以,在代码后加入一句:
import java.util.*;
public class Project4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer n1 = new Integer(49);
Integer n2 = new Integer(49);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
System.out.println(n1.equals(n2));
}
}
此时再看此程序的输出结果:
可以看到在输出equals()方法时,实际比较的是对象的值,这个问题得以解决,但是,仍然存在另一个问题,单独的equals()方法默认比较的仍然是句柄而并非对象的值,sun公司在编写JAVA类库的时候equals()方法进行了大部分的重写,使得它的比较为对象的值,那么如果我们自己创建一个类,进行equals()方法使用的时候仍然会出现一些问题,比如如下代码:
import java.applet.*;
class Value{
int i;
}
public class project5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Value n1 = new Value();
Value n2 = new Value();
n1.i=n2.i=49;
System.out.println(n1.equals(n2));
}
}
我们的本意是想比较两个对象的值,但是此时的输出为:
所以,对于equals()方法默认仍然为比较对象的句柄,我们必须通过自己在自己的类中重写equals()方法才能使它达到我们的要求,在实际的编程中如果不注意这一细节,那么会导致局部的输出问题。