一、== 和 equals
== 在比较两个基本数据类型的时,比较的是两个基本类型的值。如果比较的是两个对象比较的是两个对象的地址。
equals 是 Ojbect 中的方法,在 Java 中所有的类都继承自 Object ,所以所有类都有 equals 方法,来看一下 Object 中 equals 方法
public class Object {public boolean equals(Object obj) {return (this == obj);}}
通过上述代码能够看到,在 Object 中 equals 等价于 ==
不过通常 equals 在类中会被重写,比如:String
String equals 方法相关代码如下:
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}}
通过上述代码能够知道,String 中的 equals ,对比的对象都要是字符串,两个字符串地址相同,或者值相同,就认定两个 String 相同。
再来看下 Integer 中的 equals,代码如下
public final class Integer extends Number implements Comparable<Integer> {public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}}
Integer equals 进行对比判断很直接,对比的对象都要是 Integer ,且两个 Integer 对象值相等,这时候才认定两个 Integer 对象相等。
二、总结
== 和 Object#equals 是等价的,它们对比两个对象都是比较两个对象的地址是否相等,以此来判断两个对象是否相等。
不过 == 不一定等价于 其他类的 equals ,因为 equals 通常会被重写,而是否等价,取决于重写后的代码实现。
