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]-----深圳