HashMap集合 1.键是Student类对象;2.值是String; 的 案例

 Student 类:

package com.demo.main;

public class Student {

	private String name ; 
	private int age ;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	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;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int 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) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) 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;
	} 
}

Main类:

package com.demo.main;

import java.util.HashMap;

public class Main {

	public static void main(String[] args) {

		HashMap<Student,String> map = new HashMap<>() ; 
		map.put(new Student("张三",13),"北京");
		map.put(new Student("张三",13),"上海");
		map.put(new Student("李四",14),"深圳");
		map.put(new Student("王五",15),"广州");
		map.put(new Student("赵六",16),"济宁");
		//重写HashCode和equals方法之前:
		//System.out.println(map);输出了Student [name=张三, age=13]=上海, Student [name=张三, age=13]=北京,因为前面的Student对象一样,但是hashcode默认算出的是不一样的,所以后面的没有将前面相同的覆盖掉。
		//比较 自定义类的对象是否相等,需要重写HashCode和equals两个方法,这一点和HashSet集合相似,hashcode相同再调用equals方法。
		
		//重写HashCode和equals方法之后:
		System.out.println(map);//只剩下Student [name=张三, age=13]=上海,上海的张三把北京的张三覆盖了。
		
		//为什么输出的结果格式为:Student [name=张三, age=13]=上海  Student[name=,age=]= 这样的。
		/*
		 * 分析: 
		 * 在HashMap中	Ctrl+o 搜索 toString()方法,
		 * 在Entry中有一个toString,但是Entry是HashMap类的内部类,
		 * 内部类中的方法,不能被HashMap直接调用,
		 * 所以去HashMap的父类中找一下是否继承了父类的toString()方法。
		 * 	
		 * HashMap extends AbstractMap implements Map 
		 * HashMap的父类为AbstractMap。
		 * 在AbstractMap中ctrl+o 搜索toString()方法:找到了。
		 * 所以HashMap类继承了AbstractMap类中的toString()方法。
		 * 
		 */
	}

}

猜你喜欢

转载自blog.csdn.net/Ameir_yang/article/details/81361083