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替换掉了
         */
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值