你知道下面的 Java 代码输出结果是什么吗?
JavaTester.java
public class JavaTester { private double re, im; public JavaTester(double re, double im) { this.re = re; this.im = im; } public static void main(String[] args) { JavaTester c1 = new JavaTester(10, 15); JavaTester c2 = new JavaTester(10, 15); if (c1 == c2) { System.out.println("Equal"); } else { System.out.println("Not Equal"); } } }
结果是显而易见的。非常简单,就是 Not Equal
。
上面这段代码,编译运行的结果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester Not Equal
但你知道为什么吗?
答案也是很简单的:当我们比较 c1
和 c2
时,Java 只是简单的检查 c1
和 c2
是否都指向同一个对象。
上面的代码中,c1
和 c2
指向的是两个不同的对象,因此值 c1 == c2
的比较为 false
。但如果我们创建了另外一个引用,比如下面代码中的 c3
,那么 c1 == c3
的结果将是 true
。
Complex c3 = c1; // (c3 == c1) will be true
那么,对于相等操作,我们要如何检查对象内部的值是否相等,而不是去比较它们是否指向同一个对象呢?
我们知道,Java 中的对象都是直接或间接的继承自 java.lang.Object
类 。而 Object 类 则包含了一些基本的方法,比如 clone()
、toString()
和 equals()
等等。其中,equals()
方法就是用来比较两个对象是是否相等的操作的方法。
因此,我们可以通过重写 equals()
方法来检查两个对象是否具有相同的数据。就像下面这个范例中所演示的那样
public class JavaTester { private double re, im; public JavaTester(double re, double im) { this.re = re; this.im = im; } // 重写 equals() 方法来比较两个对象 @Override public boolean equals(Object o) { // 如果 o 对象指向了自己,则不用比较直接返回 true if (o == this) { return true; } // 如果 o 对象不是当前类的实例,那么直接返回 false if (!(o instanceof JavaTester)) { return false; } // 把 o 对象转换为当前类,这样我们才能比较 JavaTester c = (JavaTester) o; // 比较两个实例的数据 return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0; } public static void main(String[] args) { JavaTester c1 = new JavaTester(10, 15); JavaTester c2 = new JavaTester(10, 15); if (c1.equals(c2)) { System.out.println("Equal "); } else { System.out.println("Not Equal "); } } }
编译运行的结果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester Equal
建议: 当我们重写
equals()
方法时,最好同时重写hashCode()
方法。如果我们不这样做,则相等的对象可能会获得不同的哈希值,从而导致基于 hash 值的集合,比如 HashMap,HashSet 和 Hashtable 无法正常工作。
目前尚无回复