首先我們定義一個新的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替換掉了
*/
}
}