JAVA--HashCode 基础(判断对象是否相等)

HashCode基础

hashCode在JAVA中,代表了对象的一种特征。不同的对象哈希码是不同的。
哈希码是一种数据结构算法,在JAVA中,常见的哈希码算法获取到的哈希码具体值是怎么获取到的呢?
来分析一下:
1.在String类中的hashCode是根据String类中包含的字符串获取的,根据哈希算法获取到一个哈希码,那么只要我的字符内容是相等的,我的哈希码也是相同的。eg:
public static void main(String[] args) {
String a ="cx";
String b = "cx";
System.out.println(b.hashCode()==a.hashCode());
	}
结果 我想大家已经猜到了,true!

2.Integer类中的hashCode和String是一样的,也是根据类中包含的值去生成的哈希码。两个相同大小的integer值,那么它的hashCode也是相等的。eg:
Integer a =11;
		Integer b = 11;
		System.out.println(b.hashCode()==a.hashCode());
结果还是true!

3.Object类中的hashCode则和之前的不一样了,他是根据对象的内存地址经过哈希算法之后获取到的哈希码,由于每个对象的内存地址不相同,所以hashCode是不同的。


我们常常会去用hashCode和equals去判断对象是否相等!

在Hashtable、HashMap、HashSet、LinkedHashMap中,我们去判断集合中是否有相同的对象,我们就要去重写对象的hashCode和equals来帮助我们获取到集合中相同的对象!
在上述的Hash运用的集合里面,执行操作时,都会自动执行对象的hashCode方法。去进行判断是否是同一个对象。

**如HashMap在put的时候key不能相同,那么在我添加对象到key的时候就会去调用hashcode和equals方法,去判断是否是同一个对象,如果不是那么就加入集合,是的话则不加入。
所以我们重写hashCode,可以return 一个对象的uuid.hashCode()这样去进行判断

HashSet也是如此,原理是相同的。
	Map<StaticTest, String> map = new HashMap<StaticTest, String>();
		StaticTest st = new StaticTest();
		st.setI(55);
		st.setName("cx");
		map.put(st, "OK");
		Set<StaticTest> set = map.keySet();
		StaticTest obj = new StaticTest();
		obj.setI(55);
		obj.setName("cx1");
		map.put(obj, "OK");
		for (StaticTest staticTest : set) {
			System.out.println(staticTest.getName());
		}
	}
重写的hashCode()和equals():
	@Override
	public int hashCode() {
		System.out.println("执行hashCode");
		return i.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals");
		if(this.getClass() == obj.getClass()){
			return i.equals(((StaticTest)obj).getI());
		}
		return false;
	}

最终输出的结果是cx,map里面就一个对象,就是我第一次添加的那个。第二次添加的由于i是相同的所以判断它们是同一个对象,就没有被Put进去!!!!




  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想判断两个 Java 对象里面的数据是否全部相等,可以重写该对象的 `equals` 方法和 `hashCode` 方法。 重写 `equals` 方法,需要满足以下条件: 1. 对象的类型必须一致。 2. 对象的所有属性必须相等。 重写 `hashCode` 方法,需要满足以下条件: 1. 如果两个对象使用 `equals` 方法比较结果相等,那么它们的 hashCode 值也必须相等。 2. 如果两个对象使用 `equals` 方法比较结果不相等,那么它们的 hashCode 值也可以不相等,但是建议尽量让它们的 hashCode 值不同,以提高哈希表的性能。 下面是一个示例代码: ```java public class Person { private String name; private int age; private String address; // getters and setters @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof Person)) { return false; } Person other = (Person) obj; return Objects.equals(name, other.name) && age == other.age && Objects.equals(address, other.address); } @Override public int hashCode() { return Objects.hash(name, age, address); } } ``` 在上面的示例中,我们使用了 Java 7 引入的 `Objects` 工具类来判断对象的属性是否相等,并且使用了 `Objects.hash` 方法来计算 hashCode 值。注意,在 `equals` 方法中使用了 `Objects.equals` 方法来判断字符串是否相等,而不是使用 `equals` 方法,这是因为字符串可能为 null,如果使用 `equals` 方法会抛出 NullPointerException 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值