java中的“==”:
基本数据类型之间用==比的是值
引用数据类型之间用==比较的是内存存放的地址
java中的equals方法:
它是一个可以重写可以重写的方法,如果不重写equals方法,那它和“==”号作用相同,比较的是对象存放的地址。重写后,可以比较对象的值。
举个例子: 用String来作为例子,当定义了两个字符串之后,调用equals方法,判断两个字符串是否相等,源码是这么实现的:
(1)判定传入的对象和当前对象是否为同一个对象,如果是就直接返回true.
(2) 判定传入的类型值是否为String,若不是则返回false;
(3)判定传入的String与当前的String的床都是否一致,若不一致就返回false;
(4)循环对比两个字符串的char[]数组,逐个对比字符是否一致,若存在不一致的情况,则直接返回false;
(5)循环结束都没有找到不匹配的,所以最后返回true;
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;
}
要注意的是,当重写了equals方法之后,最好要重写hashcode方法。因为equals和hashcode的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
即:
(1).obj1.equals(obj2)为true时,obj1.hashcode() == obj2.hashcode()必须为true
(2).obj1.hashcode() == obj2.hashcode()为false是,obj1.equals(obj2)必须为false
那如何重写hashcode方法呢:
//anything为要比较的属性
@Override
public int hashCode() {
int result = 17;
result = result * 31 + anything.hashCode();
return result;
}