首先我们定义一个新的Person类:包括了年龄和姓名两个属性
import java.util.*;
public class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(){
}
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 boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return getAge() == person.getAge() &&
getName().equals(person.getName());
}
@Override
public int hashCode() {
return Objects.hash(getName(), getAge());
}
*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
1.我们想要通过HashMap 来构造一个 地名映射到人 的Map (地名 --> 人)
HashMap存储自定义类型键值
key:String类型
String类重写hashCode方法和equals方法,可以保证key唯一
value:Person类型
value可以重复(同名同年龄的人视为同一个)
import java.util.*;
public class Main {
public static void main(String[] args) {
//Scanner cin = new Scanner(System.in);
show01();
}
/*
HashMap存储自定义类型键值
key:String类型
String类重写hashCode方法和equals方法,可以保证key唯一
value:Person类型
value可以重复(同名同年龄的人视为同一个)
*/
private static void show01(){
//创建HashMap集合
HashMap<String, Person> map = new HashMap<>();
//往集合中添加元素
map.put("北京", new Person("张三",18));
map.put("上海", new Person("李四",19));
map.put("广州", new Person("王五",20));
//这里北京映射的value值发生冲突,后面的将顶替前面的
map.put("北京", new Person("赵六",18));
//使用keySet+增强for遍历Map集合
Set<String> set = map.keySet();
for (String key : set){
Person value = map.get(key);
System.out.println(key + " --> " +value);
}
/*运行结果
上海 --> Person{name='李四', age=19}
广州 --> Person{name='王五', age=20}
北京 --> Person{name='赵六', age=18}
//张三被赵六顶下去
*/
}
}
2.我们想要通过HashMap 来构造一个 人映射到地名 的Map (人 --> 地名)
HashMap存储自定义类型键值 key:Person类型 Person类重写hashCode方法和equals方法,可保证key唯一 value:String类型 可以重复
我们发现,对于key值,包括了两个属性,name和age,我么规定姓名和年龄相同的是一个人。
Java 会根据我们在Person类中是否重写hashCode()方法和equals()方法,判断年龄与姓名相同的两人是否是同一个人。
import java.util.*;
public class Main {
public static void main(String[] args) {
//Scanner cin = new Scanner(System.in);
show02();
}
/*
HashMap存储自定义类型键值
key:Person类型
Person类重写hashCode方法和equals方法,可保证key唯一
value:String类型
可以重复
*/
private static void show02(){
//创建HashMap集合
HashMap<Person, String> map = new HashMap<>();
//往集合中添加元素
map.put(new Person("女王", 18), "英国");
map.put(new Person("秦始皇", 18), "秦国");
map.put(new Person("普京", 30), "俄罗斯");
map.put(new Person("女王", 18), "毛里求斯");
//使用entrySet和增强for遍历Map集合
Set<Map.Entry<Person, String>> set = map.entrySet();
for (Map.Entry<Person, String> entry : set){
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " --> " + value);
}
/*
如果不重写hashCode()方法和equals()方法
运行结果:
Person{name='普京', age=30} --> 俄罗斯
Person{name='秦始皇', age=18} --> 秦国
Person{name='女王', age=18} --> 英国
Person{name='女王', age=18} --> 毛里求斯
显然,第四条和第一条Java当成了两个不同的key值
*/
/*
如果重写hashCode()方法和equals()方法
运行结果:
Person{name='女王', age=18} --> 毛里求斯
Person{name='秦始皇', age=18} --> 秦国
Person{name='普京', age=30} --> 俄罗斯
第四个和第一个的key值被当成了同一个,第四个出现的key将第一个出现的key替换掉了
*/
}
}