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

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);
    }
posted @ 2024-01-19 18:47  千千寰宇  阅读(15)  评论(0编辑  收藏  举报