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