私は毎秒かなりの数のトランザクションを受け取るものを書いています。着信するトランザクションごとに、キー値が 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 を返し、2 番目のテストは想定どおりに false を返します。map.containsKey() メソッドは、 equals() が呼び出される前に、最初にオブジェクトの hashcode メソッドを呼び出して比較しているようです。ハッシュが一致しない場合は、比較する必要さえありません。これは機能しますが、マップをだますためにこの方法で hashcode メソッドを実装する必要があるのは少し危険です。
これを行うためのより効率的な方法があるかどうか疑問に思っていました。毎秒かなりの数のトランザクションを処理しているため、マップ上でかなりの数のルックアップを行っています。
PS: これはブラインドでコーディングしたので、構文エラーがあると確信しています。それらは無視してください。一般的な考えを伝えようとしているだけです。