- equals() 的作用是什么?
- equals() 与 == 的区别是什么?
- hashCode() 的作用是什么?
- hashCode() 和 equals() 之间有什么联系?
1.equals()作用:
equals字面意思:相等,很容易就联想到这个方法是不是就是用来判断对象与对象是不是一样,是不是相等,其实equals()方法分为两种:
- 没有重写的equals() 即Object的equals()方法
- 重写了点equals(),可以是我们自己重写的,根据自己需要比较对象,也有别人写好的,例如String中的equals()就是重写了的equals()方法
先看看没有重写的equals()方法
public boolean equals(Object obj) {
return (this == obj);
}
这是Object里边的equals()方法,意思就是比较当前对象和参数对象是否相等,即
this ==
"=="操作符的作用
1、用于基本数据类型的比较
2、判断引用是否指向堆内存的同一块地址。
因此
== 比较的是等号两边对象的内存地址是否相同,所以Object类中的equals方法默认比较的是对象的地址,只有是相同的地址才会相等(x == y),所以,如果没有重写equals方法,那么默认就是比较的是地址
在看看重写的equals()方法,这里以String的为例子
public boolean equals(Object anObject) {
// 如果两个对象相等,即为同一对象,则返回true
if (this == anObject) {
return true;
}
// 否则,如果是String类型的对象,就一个字符一个字符的比较
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的注意点
1.String作为基本类型来使用==和equals
public static void main(String[] args) {
// TODO Auto-generated method stub
// String 作为基本类型
String s1 = "java";
String s2 = "java";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
结果:
true
true
2.String作为引用类型来使用==和equals
public static void main(String[] args) {
// TODO Auto-generated method stub
// String 作为引用类型
String s11 = new String("java");
String s22 = new String("java");
System.out.println(s11 == s22);
System.out.println(s11.equals(s22));
}
结果:
false
true
之所以要补充上边两点就是因为,当String 作为基本类型时,并没有new String(),也就是并没有创建String实例,并存放于堆上,而 == 是比较堆上两对象内存地址是否相同的,所以,只有第二个 == 才返回false,更加深刻了 == 和equals的区别
java对equals的几点要求
- 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"。
- 反射性:x.equals(x)必须返回是"true"。
- 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。
- 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。
- 非空性,x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。