关于==,equals()和hashcode()

关于==,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值