2

我正在使用 ehcache(通过 Grails 插件)。将对象添加到缓存的方法要求键是可序列化的,因此典型的用法是:

def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)

(布尔参数表示对象应该添加到分布式缓存还是本地缓存)

我的问题是我应该如何从值对象生成键,例如:

class Person implements Serializable {
  String firstName
  String lastName
  Integer age
}

一种方法是提供 hashCode() 和 equals() 方法并使用 hashCode 作为键。在这种情况下,我不需要让 Person 类实现 Serializable。

或者,我可以简单地使用 Person 对象本身作为键。似乎我仍然需要提供 equals 和 hashCode 方法,但也需要实现 Serializable。但是,使用这种方法发生冲突的可能性似乎较小,因为 Person 只能等于 Person 的另一个实例。

我假设 ehcache 使用一个键的 equals() 方法来确定该键是否已经存在于缓存中,这个假设是否正确?

上面概述的任何一种方法本质上都比另一种更好,还是我没有考虑过另一种方法?

谢谢,唐

4

1 回答 1

2

您的 hashkey 问题大多与可序列化问题正交。在回答 hashkey 时,我会使用 Apache Commons HashCodeBuilder。它为您完成所有繁重的工作。与 equals 类似,使用 EqualsBuilder。

但请记住,哈希码需要在对象的生命周期内保持不变,因此只对那些不会改变的内部元素进行哈希处理。

我会避免使用 Person 对象作为键,因为这会调用它 equals() 来检查键比较,这可能比比较整数哈希码要慢。

于 2009-09-10T21:47:27.697 回答