[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);
    }
    
    本文作者:
        千千寰宇
    
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

                
            
        
浙公网安备 33010602011771号