javaSE HashMap,自定义类型对象作为键存放,需要重写hashCode()和equals()方法

时间:2022-01-24 14:11:38

使用HashMap集合,存储自定义的对象。 如果自定义的对象作为键(键不能重复),需要重写自定义类型的hashCode()和equals()方法。

8种基本数据类型对应的引用类型(包装类),以及String类型已经自动重写了hashCode()和equals()方法。


Demo.java:

package cn.xxx.demo;

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

// 使用HashMap集合,存储自定义的对象。 如果自定义的对象作为键(键不能重复),需要重写自定义类型的hashCode()和equals()方法。

public class Demo {
	public static void main(String[] args) {
		function();
	}

	public static void function(){
		HashMap<Person, String> map = new HashMap<Person, String>();
		map.put(new Person("a",20), "里约热内卢");
		map.put(new Person("b",18), "索马里");
		map.put(new Person("b",18), "索马里");
		map.put(new Person("c",19), "百慕大");
		for(Person key : map.keySet()){  // 通过keySet()遍历
			String value = map.get(key);
			System.out.println(key+"..."+value);
		}
		System.out.println("===================");
		for(Map.Entry<Person, String> entry : map.entrySet()){  // 通过entrySet()遍历
			System.out.println(entry.getKey()+"..."+entry.getValue());
		}
	}
}
Person.java(Penson作为键,要重写hashCode()和equals()方法):
package cn.xxx.demo;

public class Person {
	private String name;
	private int age;
	
	@Override
	public int hashCode() {  // 重写hashCode()方法
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {  // 重写equals()方法
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
		
	}
	@Override
	public String toString() {
		return "Person " + name  +"...."+ age ;
	}
	
}