Java集合框架——HashMap集合案例实操

HashMap集合案例实操

练习一:HashMap<String,Person>,键:身份证号,值:人对象

//Person.java
package com.map.demo2;

public class Person {
    
    
	private String name;
	private int age;
	
	public Person() {
    
    
		super();
	}

	public Person(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 "Person [name=" + name + ", age=" + age + "]";
	}
}
//MapTest.java
package com.map.demo2;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapTest {
    
    
	public static void main(String[] args) {
    
    
		Map<String, Person> map = new HashMap<String, Person>();
		
		Person p1 = new Person("张三", 18);
		Person p2 = new Person("李四", 19);
		Person p3 = new Person("王五", 20);
		Person p4 = new Person("赵六", 21);
		Person p5 = new Person("马七", 22);
		
		map.put("111111", p1);
		map.put("222222", p2);
		map.put("333333", p3);
		map.put("444444", p4);
		map.put("555555", p5);
		map.put("666666", p5);
		
		//方法一
//		Set<Entry<String, Person>> entrySet = map.entrySet();
//		for (Entry<String, Person> entry : entrySet) {
    
    
//			System.out.println(entry.getKey() + "---" + entry.getValue());
//		}
		
		//方法二
		Set<String> keySet = map.keySet();
		for (String str : keySet) {
    
    
			Person person = map.get(str);
			System.out.println(str+ "-----" + person);
		}
	}
}
***执行结果:***
444444-----Person [name=赵六, age=21]
555555-----Person [name=马七, age=22]
111111-----Person [name=张三, age=18]
666666-----Person [name=马七, age=22]
222222-----Person [name=李四, age=19]
333333-----Person [name=王五, age=20]

练习二:HashMap<Person,String>,键:人对象,值:地址

//Person.java
package com.map.demo2;

public class Person {
    
    
	private String name;
	private int age;
	
	public Person() {
    
    
		super();
	}

	public Person(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 "Person [name=" + name + ", age=" + age + "]";
	}
}
package com.map.demo2;

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

public class MapTest2 {
    
    
	public static void main(String[] args) {
    
    
		Map<Person, String> map = new HashMap<Person, String>();
		
		Person p1 = new Person("张三", 18);
		Person p2 = new Person("李四", 19);
		Person p3 = new Person("王五", 20);
		Person p4 = new Person("赵六", 21);
		Person p5 = new Person("马七", 22);
		
		map.put(p1, "北京");
		map.put(p2, "上海");
		map.put(p3, "深圳");
		map.put(p4, "四川");
		map.put(p5, "广州");
		
		Set<Person> keySet = map.keySet();
		for (Person person : keySet) {
    
    
			String address = map.get(person);
			System.out.println(person + "-----" + address);
		}
	}
}
***执行结果:***
Person [name=赵六, age=21]-----四川
Person [name=马七, age=22]-----广州
Person [name=李四, age=19]-----上海
Person [name=张三, age=18]-----北京
Person [name=王五, age=20]-----深圳

举一反三 ①:

  • 在原来代码的基础上再向Map集合中添加一对(p5, “广州”)
    在这里插入图片描述
  • 可以发现执行结果未发生变化
    在这里插入图片描述
  • 原因:两个p5的hashCode值相同,地址值相同,equals值也为true

举一反三 ②:

  • 再创建一个Person对象p6,其姓名、年龄、地址均与p5相同
    在这里插入图片描述
  • 执行结果中将出现两个“Person [name=马七, age=22]-----广州”
    在这里插入图片描述
  • 原因:虽然p5和p6的姓名和年龄相同,但是它们在内存中是两个不同的对象,且上述代码未重写hashCode和equals方法
  • 为了让两个对象判断时比较的是成员变量,需要重写hashCode和equals方法
  • 与HashSet集合的判断方法类似
  • 参考文章:《Java集合框架——hashCode方法的重写》
//Perosn.java
//eclipse自动重写hashCode和equals方法
	@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;
		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;
	}
  • 重写之后p6将无法添加到Map集合中
***执行结果:***
Person [name=马七, age=22]-----广州
Person [name=张三, age=18]-----北京
Person [name=赵六, age=21]-----四川
Person [name=李四, age=19]-----上海
Person [name=王五, age=20]-----深圳

猜你喜欢

转载自blog.csdn.net/weixin_43796325/article/details/104436845