使用自定义的类作为HashMap的key【代码演示】

简介: 使用自定义的类作为HashMap的key【代码演示】

代码实现

package com.Keafmd.April.test;
import java.util.HashMap;
/**
 * Keafmd
 *
 * @ClassName: TestHashMap
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-21 14:37
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class TestHashMap {
    public static void main(String[] args) {
        /*HashMap<Integer,String> hashMap = new HashMap<>();
        hashMap.put(1,"hello");
        hashMap.put(2,"hello2");
        hashMap.forEach((key,value)->{
            System.out.println(key+" == "+value);
        });*/
        HashMap<Person, String> map = new HashMap<Person, String>();
        map.put(new Person("keafmd"), "6666");
        map.put(new Person("keafod"), "8888");
        map.put(new Person("keafod"), "9999"); // 这样就会覆盖掉8888
        System.out.println(map.toString());
        System.out.println("===============");
        System.out.println(map.get((new Person("keafmd"))));
        System.out.println(map.get((new Person("keafod"))));
        System.out.println("===============");
        System.out.println(new String("keafmd").hashCode());
        System.out.println("keafmd".hashCode());
        System.out.println(map.get("keafmd"));
        System.out.println("===============");
        map.forEach((key, value) -> {
            System.out.println(key.toString() + ".hashCode() = " + key.hashCode());
            System.out.println(key + ".value = " + value);
        });
    }
}
class Person {
    private String name;
    Person(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        if (name != null ? !name.equals(person.name) : person.name != null) return false;
        return true;
    }
    @Override
    public int hashCode() {
        int result = 17;
        return 31 * result + name.hashCode();
        // 这样写的话,字符串"keafmd" 和 new Person("keafmd") 的哈希值就是一样的,
//        return name != null ? name.hashCode() : 0;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

运行效果

{Person{name='keafod'}=9999, Person{name='keafmd'}=6666}
===============
6666
9999
===============
-1135381290
-1135381290
null
===============
Person{name='keafod'}.hashCode() = -1135380701
Person{name='keafod'}.value = 9999
Person{name='keafmd'}.hashCode() = -1135380763
Person{name='keafmd'}.value = 6666
Process finished with exit code 0


总结

      我们想要将自定义的类作为HashMap的key我们必须重写equals()和hashCode()方法,这样才能给每个作为key的对象一个唯一的hashcode值,这样就可以成功的使用自定义的类作为HashMap的key。


以上就是使用自定义的类作为HashMap的key的全部内容。


相关文章
|
25天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
52 2
|
1月前
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
23天前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
40 3
|
1月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
29 0
|
3月前
|
开发者 C# UED
WPF与多媒体:解锁音频视频播放新姿势——从界面设计到代码实践,全方位教你如何在WPF应用中集成流畅的多媒体功能
【8月更文挑战第31天】本文以随笔形式介绍了如何在WPF应用中集成音频和视频播放功能。通过使用MediaElement控件,开发者能轻松创建多媒体应用程序。文章详细展示了从创建WPF项目到设计UI及实现媒体控制逻辑的过程,并提供了完整的示例代码。此外,还介绍了如何添加进度条等额外功能以增强用户体验。希望本文能为WPF开发者提供实用的技术指导与灵感。
141 0
|
5月前
|
存储 安全 Java
《ArrayList & HashMap 源码类基础面试题》面试官们最喜欢问的ArrayList & HashMap源码类初级问,你都会了?
《ArrayList & HashMap 源码类基础面试题》面试官们最喜欢问的ArrayList & HashMap源码类初级问,你都会了?
39 0
|
5月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【6月更文挑战第18天】在Java中,Map的两大代表HashMap和TreeMap提供高效键值对操作。HashMap允许设定初始容量和加载因子以优化性能,非线程安全,可借助synchronized或ConcurrentHashMap处理多线程。遍历可通过entrySet()、keySet()和values()。而TreeMap依据键进行排序,支持自然排序和自定义Comparator,提供范围查询、获取首尾键的功能,适用于需有序遍历的场景。理解和利用这些特性能增强代码功能和效率。
51 0
|
6月前
|
Python
2024年Python最新刷爆全网的动态条形图,原来5行Python代码就能实现!,2024年最新Python面试必问的HashMap
2024年Python最新刷爆全网的动态条形图,原来5行Python代码就能实现!,2024年最新Python面试必问的HashMap
2024年Python最新刷爆全网的动态条形图,原来5行Python代码就能实现!,2024年最新Python面试必问的HashMap
|
11月前
|
存储
HashMap HashTable ConcurrentMap 中key value是否可以为null
HashMap HashTable ConcurrentMap 中key value是否可以为null
74 0
|
Java
自定义list To HashMap工具类
自定义list To HashMap工具类
45 0