1.==等号
对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例;又可以说是判断对象实例是否物理相等;(参见:http://kakajw.iteye.com/blog/935226)
2.equals
查看底层object的equals方法 public boolean equals(Object obj) { return (this == obj); }
当对象所属的类没有重写根类Object的equals()方法时 调用==判断 即物理相等
当对象所属的类重写equals()方法(可能因为需要自己特有的“逻辑相等”概念)
equals()判断的根据就因具体实现而异:
如String类重写equals()来判断字符串的值是否相等
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引用 实际上是指向同一个String对象时(物理相等)则返回true
如果物理不相等,还要判断:通过遍历两个对象底层的char数组,如果每一个字符都完全相等,则认为这两个对象是相等的(逻辑相等)
3.hashCode()
java.lang.Object类的源码中 方法是native的
<span style="font-size:18px;">public native int hashCode();</span>
通过将该对象的内部地址转换成一个整数来实现的 ,toString方法也会用到这个hashCode
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
如果覆写了hashCode方法,则情况不一样了
eg. java.lang.String
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
String底层是一个final的char数组
private final char value[];
String的hashCode计算方式就是遍历字符数组 计算其加权和
eg.Integer类
public int hashCode() {
return value;
}
hashCode()返回的是它值本身