1、==
对于基本数据类型,== 比较的是他们的值;
对于引用数据类型,== 比较的是对象在内存中的存放地址,对象是存放在堆中,而对象的引用则存在于栈中,所以 == 则比较栈中的值是否相等。
2、equals
默认情况下 equals 方法都是调用 Object 类的 equals 方法,而 Object 的 equals 方法主要用于判断对象的内存地址引用是否为同一个地址。源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看出 Object 的 equals 方法与 == 是等效的。
3、String 类对于 equals 方法的重写
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
即 String 中 equals 方法判断相等的步骤是:
1、 若 A==B 即是同一个 String 对象,返回 true
2、 若对比对象是 String 类型则继续,否则返回 false
3、 判断 A、B 长度是否一样,不一样的话返回 false
4、 逐个字符比较,若有不相等字符,返回 false
4、equals 和 hashcode 的关系
1、如果两个对象 equals,Java 运行时环境会认为他们的 hashcode 一定相等。
2、如果两个对象不 equals,他们的 hashcode 有可能相等。
3、如果两个对象 hashcode 相等,他们不一定 equals。
4、如果两个对象 hashcode 不相等,他们一定不 equals。
将对象放入到集合中时,首先判断要放入对象的 hashcode 值与集合中的任意一个元素的 hashcode 值是否相等,如果不相等直接将该对象放入集合中。如果 hashcode 值相等,然后再通过 equals 方法判断要放入对象与集合中的任意一个对象是否相等,如果 equals 判断不相等,直接将该元素放入到集合中,否则不放入。