JAVA中“==”和equals()的区别

来源:互联网 发布:php app接口开发步骤 编辑:程序博客网 时间:2024/06/05 18:27

在JAVA中“==”对于基本数据类型来说,比较的是值的大小是否相同;但对于对象来说,比较的却是对象的句柄,而并非对象的内容,所以如下代码:

import java.util.*;public class Project4 {public static void main(String[] args) {// TODO Auto-generated method stubInteger 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 stubInteger 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 stubValue n1 = new Value();Value n2 = new Value();n1.i=n2.i=49;System.out.println(n1.equals(n2));}}
我们的本意是想比较两个对象的值,但是此时的输出为:


所以,对于equals()方法默认仍然为比较对象的句柄,我们必须通过自己在自己的类中重写equals()方法才能使它达到我们的要求,在实际的编程中如果不注意这一细节,那么会导致局部的输出问题。