关于==,equals,hashCode
先来做==和equals方法的一个比较
==
“==”比较基本数据类型变量的值是否相等,和引用数据类型的变量(对象)的引用/地址
- 举例
public class Test{
public static void main (String[] args){
int a=8;
int b=8;
System.out.println(a==b);//返回true
String str1="yew";
String str2="yew";
System.out.println(str1==str2);//返回true
String str01=new String("no");
String str02=new String("no");
System.out.println(str01==str02);//返回false
}
}
两种定义的String类型变量形式在内存中存储位置不同
equals方法
equals方法比较的是引用类型的变量所指向的对象的地址,就是说比较的是否是同一个对象
关于方法的描述
ps:
像String,Integer,Date等类,系统已经对equals()进行重写了,比较的是该对象具体所存储的值而不是地址
- 举例
String str01=new String("no");
String str02=new String("no");
System.out.println(str01.equals(str02));//返回true
Test1 t1=new Test1();
Test1 t2=new Test1();
System.out.println(t1.equals(t2));//返回false
如果说我比较我的自定义类中的一些属性的值的话,就要重写equals方法
public class Test {
String name;
String sex;
public Test(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
//@Override
// public int hashCode() {
// final int prime = 31;
// int result = 1;
// result = prime * result + ((name == null) ? 0 : name.hashCode());
// result = prime * result + ((sex == null) ? 0 : sex.hashCode());
// return result;
// }
@Override
public boolean equals(Object obj) {
if (this == obj)//如果两个对象的地址相同,返回true
return true;
if (obj == null)//比较的对象为空,返回false
return false;
if (getClass() != obj.getClass())
return false;
Test other = (Test) obj;//强转
//比较Test类中的属性
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
public static void main(String[] args) {
Test t1=new Test("sw","男");
Test t2=new Test("sw","男");
System.out.println(t1.equals(t2));//返回true
}
}
hashCode方法
为什么说改equals也要改hashCode呢?
因为修改了equals方法只是在比较对象的时候可以自定义来比较对象的一些属性什么的,new出来的对象的地址并没有改变。而有时候要将这些类存储到集合的时候,存储的就是对象的地址,这样的话两个对象就算内容相同,但没有重写hashCode方法,还是把两个对象单做不同的对象存储进去了。
- 地址的形式就是哈希code码
@Override
//最后只返回一个hashcode码
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());//获取name的hashcode码来运算
result = prime * result + ((sex == null) ? 0 : sex.hashCode());//获取sex的hashcode码来运算
return result;
}
...
Test t1=new Test("sw","男");
Test t2=new Test("sw","男");
Set s=new HashSet();
s.add(t1);
s.add(t2);
System.out.println(s); //最后只返回一个hashcode码
参考博客:https://blog.csdn.net/u012557538/article/details/89861552