理解equals,==,hashcode,
1.equals与==区别
==:
对于基本类型==就是比较值是否相等。
对于引用类型就是比较是否指向同一个引用地址。
例题:
package tree;
/**
* @author wangpei
* @version
*创建时间:2017年3月13日 下午2:33:56
* 类说明
*/
public class exercis {
public static void main(String[] args) {
int a=2;
int b=2;
String a1="1";//指向常量池中的一个常量值
String b1="1";//指向常量池中的一个常量值
String b2=new String("1");
String b3=new String("1");
System.out.println(a==b);
System.out.println(a1==b1);
System.out.println(a1==b2);//不同的引用值
System.out.println(a1==b3);
}
}
结果:
true
true
false
false
equals
equals是Object类的一个方法,返回的是该对象的引用值是否相等:
public boolean equals(Object obj) {
return (this == obj);
}
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;
}
解释:当传入的对象anObject 与 要比较的对象指向同一个引用,返回true,不等时,判断anObject与比较的对象所存的值相等返回true,否则,返回false.
也就是说,String对象对Object的equlas进行了重写,使其可以判断对象所存的值相等时,返回true
例子:
package tree;
/**
* @author wangpei
* @version
*创建时间:2017年3月13日 下午2:33:56
* 类说明
*/
public class exercis {
public static void main(String[] args) {
String a1="1";//指向常量池中的一个常量值
String b1="1";
String b2=new String("1");
String b3=new String("1");
System.out.println(a1==b3);
System.out.println(b2==b3);
System.out.println(a1.equals(b3));
System.out.println(b2.equals(b3));
}
}
结果:
false
false
true
true
java对重写equals方法进行了一写规则限制:
自反性(reflexive)
对称性(symmetric)
传递性(transitive)
一致性(consistent)
2.equals与hashcode区别
hashcode,Object类的一个本地方法
public native int hashCode();
应用hashcode主要是解决对集合操作时的一些问题。
例如对于HashSet,其元素不能出现重复值,每次添加新元素时,必须先查找是否元素已存在,如果这样挨个equals比较,当数据量大时,根本不实际。所以用到了hashcode,就是用来提高速度。
java集合具体咋应用hashcode的
1),判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2),判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
注意:**equals比较为true的两个对象,hashcode一定相等。
hashcde比较为true的两个对象,equals不一定相等**。