首页 > 编程语言 >[Java SE/JDK] Map之重定义key对象的hash值

[Java SE/JDK] Map之重定义key对象的hash值

时间:2024-01-19 18:55:46浏览次数:21  
标签:Map Java JDK connectionPool value DataSource key public

0 序言

  • 项目上有个场景:数据源连接池需要对key对象的hash值重写,保证通过相同的关键属性(datasourceName)值去重不同的对象。
public abstract class AbstractDatabaseConnectorKeyedObjectPool<K extends DataSource, V extends AbstractConnector>

1 重写Map的key对象的hash值

  • 在Java中,Map接口的key默认情况下不能被修改。如果想要自定义Map的key类型并且可以进行修改操作,需要通过重写equals()和hashCode()方法来实现。
  • 首先,我们创建一个新的类来表示自定义的Key对象,该类必须覆盖equals()hashCode()方法。

【特别注意】equals()hashCode()2个方法均需要重写才可。

  • 这两个方法用于判断两个对象是否相等以及计算其哈希值。
public class CustomKey {
    private String value; // Key的属性
    
    public CustomKey(String value) {
        this.value = value;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        
        if (!(obj instanceof CustomKey)) return false;
        
        CustomKey other = (CustomKey) obj;
        return Objects.equals(value, other.getValue());
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(value);
    }
    
    public String getValue() {
        return value;
    }
}
  • 彩蛋:项目实际应用效果
    @Test
    public void hashCodeTest(){
        /** 准备2个不同的 DataSource 对象 **/
        DataSource dataSource1 = new DataSource("jdbc:mysql://127.0.0.1:3306", "usr", "pswd");
        DataSource dataSource2 = new DataSource("jdbc:mysql://127.0.0.1:6379", "usr", "pswd2");
        DataSource dataSource3 = new DataSource("jdbc:mysql://127.0.0.1:6379", "usr", "pswd2");


        /** 模拟 数据库连接池 (以 DataSource 为 key) **/
        Map<DataSource, String> connectionPool = new HashMap<>();
        connectionPool.put(dataSource1, "connection1-1");
        connectionPool.put(dataSource1, "connection1-2");
        connectionPool.put(dataSource2, "connection2-1");
        connectionPool.put(dataSource3, "connection3-1");

        log.info(connectionPool.get(dataSource1));//connection1-2
        log.info(connectionPool.get(dataSource2));//connection2-1
        log.info("pool.size: {}", connectionPool.size());//3
        Assert.assertTrue(true);
    }

标签:Map,Java,JDK,connectionPool,value,DataSource,key,public
From: https://www.cnblogs.com/johnnyzen/p/17975376

相关文章

  • Java - 排序
      冒泡排序升序排列importjava.util.Arrays;publicclassArrayDemo07{publicstaticvoidmain(String[]args){int[]a={1,4,5,3,14,12,51};int[]sort=sort(a);System.out.println(Arrays.toString(sort));}public......
  • azul zule jdk(jvm) 8 support g1gc
    [WhichGarbageCollectorsareavailableinaparticularAzulZuluversion?–Azul](https://support.azul.com/hc/en-us/articles/360057827811-Which-Garbage-Collectors-are-available-in-a-particular-Azul-Zulu-version-) zulujdk8javaoptions*[Command-Line......
  • toMap - bug
    原因:AttachmentInfoRespnse::getAssociateKeyId作为键重复了,代码没有指定如何处理//Duplicatekey:错误代码finalMap<Long,String>keyIdWithPathMap=attachmentInfoResponse.stream().collect(Collections.toMap(AttachmentInfoRespnse::getAssociateKeyId,item->Optional......
  • Java爬虫在网络数据抓取方面有什么优势和不足
    Java爬虫是一种常用的网络数据抓取工具,它能够自动化地从网页中提取和解析数据。本文将介绍Java爬虫在网络数据抓取方面的优势和不足。一、Java爬虫的优势1.多线程支持:Java语言天生支持多线程,可以使用多线程技术提高爬虫的并发能力,加快数据抓取速度。2.丰富的第三方库:Java拥有丰富的......
  • Cubemap
    一、使用camera.RenderToCubemap(cubemap)生成自定义cubemap1.搭建场景,天空球等2.创建适合当前Pos的的CubemapEditorusingUnityEngine;usingUnityEditor;publicclassRenderCubeMap:ScriptableWizard{publicTransformrenderTrans;publicCubemapcubema......
  • java线程的基本操作
    1.线程名称的设置和获取在Thread类中可以通过构造器Thread(...)初始化设置线程名称,也可以通过setName(...)实例方法去设置线程名称,取得线程名称可以通过getName()方法完成。关于线程名称有以下几个要点:线程名称一般在启动线程前设置,但也允许为运行的线程设置名称......
  • JDK9 - VarHandle小记
    说在前面在开始之前,有必要点明一下虽只字未提但贯穿全文的核心,从而知道我们使用某些API的目的是什么:VarHandle/Unsafe提供了比volatile关键字更弱的变量访问方式,合理地利用它们可以让我们程序可以在符合运行预期的话情况下提高性能,这里的“弱”指的是约束更少。所谓约束,举个例子......
  • Java开发之Java8 新特性--流式数据处理学习
    一.流式处理简介在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需......
  • 手写 Mybatis-plus 基础架构(工厂模式+ Jdk 动态代理统一生成代理 Mapper)
    这里写目录标题前言温馨提示手把手带你解析@MapperScan源码手把手带你解析@MapperScan源码细节剖析工厂模式+Jdk代理手撕脚手架,复刻BeanDefinitionRegistryPostProcessor手撕FactoryBean代理Mapper在Spring源码中的生成流程手撕MapperProxyFactory手撕增强逻辑Invoca......
  • Java实现基于GDAL将单波段影像转为三波段影像-唯一值渲染
    在处理遥感影像的渲染时,经常需要处理单波段影像。单波段影像没有任何颜色,只有一个波段的值。渲染时只能采用色带拉伸、离散颜色、唯一值渲染这几种方式。直接将单波段影像转成三波段的影像,并将三个波段转为颜色对应的rgb值,这样可以加速渲染、切片的过程。这里我有一张单波段影像,需......