首先,要肯定“==”是 Java 中的一个运算符。
如果使用“==”运算符对基本数据类型(如:int、long、float、double 等)进行操作,则比较的是变量中存储的实际值。例如:
int a = 10; int b = 20; if(a == b) { //... }
上面代码中,“==”运算符则是对 10 和 20 进行比较。
如果使用“==”运算符对引用数据类型(如:String、Object 等)进行操作,则比较的是引用类型变量指向对象的地址值。例如:
// java.lang.Object@b684286 Object a = new Object(); // java.lang.Object@880ec60 Object b = new Object(); if(a == b) { System.out.println("a == b"); }
上面代码中,“==”运算符则是对 a 和 b 变量的值,即对象在堆中的地址进行比较,而不是对对象的实际值进行比较。
equals 是 Object 类的方法,用来比较两个对象的内容是否相等。下面看看 Object 类中equals() 方法的实现:
public boolean equals(Object obj) { return (this == obj); }
注意:equals 方法不能用于比较基本数据类型(如:int、long、float、double等)。如果在自定义的对象中没有对 equals() 方法进行重写,则相当于“==”,比较的是引用类型的变
量所指向的对象的地址值。
一般情况下,类会重写 equals 方法用来比较两个对象的内容是否相等。例如 String 类中的 equals() 就被重写了,比较的是对象的值。源代码如下:
public boolean equals(Object anObject) { // 如果两者指向堆中同一个地址,则返回 true if (this == anObject) { return true; } // 如果 anObject 不是 String 的实例,则返回 false。否则,继续比较 if (anObject instanceof String) { String aString = (String)anObject; if (coder() == aString.coder()) { return isLatin1() ? StringLatin1.equals(value, aString.value) : StringUTF16.equals(value, aString.value); } } return false; }