HashMap存儲自定義類型鍵值

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


}

 

發佈了424 篇原創文章 · 獲贊 102 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章