我正在写一些每秒会收到很多交易的东西。对于传入的每个事务,都会引用一个映射,其中键值为 id 和一个 bean,这将有助于处理该特定事务。基本上每个事务都带有一个 id,将对映射进行查找以检索相应的 bean 进行处理。棘手的部分是每个事务的 id 并不意味着与映射中的 id 精确匹配。更多的是从操作开始。为此,我没有使用字符串作为 id,而是创建了一个名为 MyId 的简单 pojo。以下代码:
public class MyId
{
private static final int HASHCODE_CONSTANT = 1;
private String value;
public MyId(String value)
{
this.value = value;
}
@Override
public int hashCode()
{
//Returns the same hashcode value for all instances of this pojo
return HASHCODE_CONSTANT;
}
@Override
public boolean equals(Object obj)
{
//Checks for object type, forcibly casts and then compares the starts with
if(obj instanceof MyId)
{
if(!(obj == null || "".equals(obj)))
{
return this.value.startsWith(((MyId)obj).getValue());
}
}
return false;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
//Test
public static void main(String[] args)
{
Map map = new HashMap();
map.put(new MyId("123456"), "");
System.out.println("Result: " + map.containsKey(new MyId("12345677")));
System.out.println("Result: " + map.containsKey(new MyId("11234567")));
}
}
第一个测试返回 true,第二个测试返回 false,就像它应该的那样。似乎 map.containsKey() 方法在调用 equals() 之前首先调用并比较了对象的 hashcode 方法。如果您的哈希不匹配,它甚至不会费心比较。虽然这可行,但必须以这种方式实现 hashcode 方法来欺骗地图,感觉有点狡猾。
想知道是否有更有效的方法来做到这一点。我们每秒处理相当多的事务,因此在地图上进行了相当多的查找。
PS:我对此进行了盲编码,因此我确定存在语法错误。请忽略那些。只是试图传达总体思路。