hashcode、equals、HashMap间的关系

本文探讨了Java中Object的基本属性,包括hashCode和equals方法的行为,并通过实例展示了String类的特性。此外,还深入研究了如何为自定义类正确实现hashCode和equals方法,以确保在集合框架中的正确行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、从Object说起

package com.hallo.collection;

public class ObjectDemo {

	public static void main(String[] args) {
		 
		Object o1 = new Object();
		Object o2 = new Object();
		
		//同一Object对象,hashCode永远相同
		assert(o1.hashCode() == o1.hashCode());
		//不同Object对象,hashCode永远不相同
		assert(o1.hashCode() != o2.hashCode());
		
		//不同对象equals返回false
		assert(!o1.equals(o2));
		
		System.out.println("end");
		
	}
}

输出:end

2、String类Demo

package com.hallo.collection;

public class StringDemo {

	public static void main(String[] args) {
		
		String str1 = "hello";
		String str2 = "hello";
		String str3 = new String("hello");
		
		//不同string对象(==不成立)保存相同字符串时,hashCode和equals返回相同
		assert(str1.hashCode() == str2.hashCode());
		assert(str1.equals(str2));
		assert(str2.hashCode() == str3.hashCode());
		assert(str2.equals(str3));
		
		System.out.println("end");
	}
}

输出:end

3、自定义类,重写hashcode、equals方法

package com.hallo.collection;

import java.util.HashMap;
import java.util.Map;

public class MyObject {

	private String name;
	
	public String getName() {
		return name;
	}

	public MyObject(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		//使用object类的方法
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		
		if(this == obj)
			return true;
		
		if(obj instanceof MyObject) {
			return ((MyObject) obj).getName().equals(this.getName());
		}
		
		return false;
	}
	
	public static void main(String[] args) {
		
		MyObject o1 = new MyObject("k1");
		MyObject o2 = new MyObject("k1");
		MyObject o3 = new MyObject("k3");
		
		Map<MyObject, String> myObjectMap = new HashMap<MyObject, String>();
		myObjectMap.put(o1, "o1");
		myObjectMap.put(o1, "o11");
		myObjectMap.put(o2, "o2");
		myObjectMap.put(o3, "o3");
		
		System.out.println(myObjectMap);
	}
	
}

输出:

{com.hallo.collection.MyObject@7852e922=o11,

com.hallo.collection.MyObject@70dea4e=o3,

com.hallo.collection.MyObject@4e25154f=o2}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值