我正在使用 ehcache(通过 Grails 插件)。将对象添加到缓存的方法要求键是可序列化的,因此典型的用法是:
def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)
( boolean 参数表示对象应该被添加到分布式缓存还是本地缓存)
我的问题是我应该如何从值对象生成键,例如:
class Person implements Serializable {
String firstName
String lastName
Integer age
}
一种方法是提供 hashCode() 和 equals() 方法并使用 hashCode 作为键。在这种情况下,我不需要让 Person 类实现 Serializable。
或者,我可以简单地使用 Person 对象本身作为键。看起来我仍然需要提供 equals 和 hashCode 方法,但还需要实现 Serializable。但是,使用这种方法发生冲突的可能性似乎较小,因为一个 Person 只能等于另一个 Person 实例。
我假设 ehcache 使用一个键的 equals() 方法来确定该键是否已经存在于缓存中,这个假设是否正确?
上面列出的任何一种方法在本质上都比另一种更好,还是有另一种我没有考虑过的方法?
谢谢, 唐
最佳答案
您的散列键问题大部分与可序列化问题正交。作为哈希键的答案,我会使用 Apache Commons HashCodeBuilder。它为您完成所有繁重的工作。与 equals 类似,使用 EqualsBuilder。
不过请记住,哈希码需要在对象的整个生命周期内保持不变,因此只对那些不会改变的内部元素进行哈希处理。
我会避免使用 Person 对象作为键,因为它会调用 equals() 来检查键比较,这可能比比较整数哈希码慢。
关于java - 缓存键生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1407523/