Java 如何重写序列化对象中的hashCode和equals方法?
我正在使用Java 如何重写序列化对象中的hashCode和equals方法?,java,oracle-coherence,Java,Oracle Coherence,我正在使用NamedCache.get(cacheKey)和NamedCache.put(cacheKey,cacheValue)并在cacheKey对象中重写hashCode和equals方法,同时使cacheKey对象可序列化。但是没有调用hashCode和equals方法 为什么会这样 我发布了上述问题的示例代码 import java.io.Serializable; import java.util.HashMap; import java.util.Map; import com.
NamedCache.get(cacheKey)
和NamedCache.put(cacheKey,cacheValue)
并在cacheKey
对象中重写hashCode
和equals
方法,同时使cacheKey
对象可序列化。但是没有调用hashCode
和equals
方法
为什么会这样
我发布了上述问题的示例代码
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
class HelloEx implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6280029994647038136L;
String str = "HelloEx" ;
HelloEx(String s){
str = s ;
}
public int hashCode() {
System.out.println("Inside HashCode");
return 1;
}
public boolean equals(Object o) {
HelloEx s = (HelloEx)o ;
if(str.equals(s.str)){
System.out.println("Both are equal");
return true;
}
return false;
}
}
public class HashSetEg {
public static void main(String[] args) {
HelloEx hEx4 = new HelloEx("Four");
HelloEx hEx5 = new HelloEx("Five");
HelloEx hEx6 = new HelloEx("Six");
Map hp = new HashMap();
hp.put(hEx4,hEx4);
hp.put(hEx5,hEx5);
hp.put(hEx6,hEx6);
hp.put(hEx6,hEx6);
System.out.println("Test");
hp.get(hEx6);
hp.put(new String("aa"),new String("aa"));
System.out.println("Test");
//System.out.println("HashSet " + hp );
NamedCache aggCache = CacheFactory.getCache("MyCache");
aggCache.put(hEx4,hEx4);
aggCache.put(hEx6,hEx6);
aggCache.put(hEx6,hEx6);
System.out.println("End");
}
}
上述代码的输出为:
内部哈希代码
内部哈希代码
内部哈希代码
内部哈希代码
试验
内部哈希代码
试验
结束
此代码使用oracle相干技术。因此,NamedCache是相干.jar中的一个接口,用于保存相干服务器上创建的缓存的引用,该缓存将由应用程序和“CacheFactory.getCache(“MyCache”)使用用于在coherence server上创建名为MyCache的缓存,在该缓存中,我们存储键值对,就像在HashMap中存储数据一样。据我从文章中了解,
NamedCache
在调用put
时不会调用hashCode
而且,根据这篇文章,你必须注意如何实现
hashCode
和equals
。你能发布你的代码吗?恐怕我不能在这里发布实际的代码。因为它在我的客户机VM上(不能从这里访问)。你当然可以。创建并粘贴(确保它确实是mcve)。重要的是,你要努力清楚地解释你在做什么,在这种情况下,几乎必须包括代码,即使它不是你真正拥有的代码——只要它表现出与减少后需要解决的问题相同的问题。什么是NameCache
?什么是可序列化缓存密钥对象?你用什么代码来证明这个不可能的说法?这不是一个真正的问题。映射将调用hashCode和equals,如果您的代码没有调用这些方法,可能NamedCache不是映射,或者您做了一些错误的事情。很抱歉,这没有帮助。我没有得到你的第二个line@RaJnish,你读过这篇文章吗?密钥类中的所有可序列化(非瞬态)字段必须在equals实现中使用。hashCode在put时不被调用,并且您的测试显示没有。您能提供我那篇文章的链接吗?链接在答案中(尝试单击“this”一词)。以防你仍然找不到它: