Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何重写序列化对象中的hashCode和equals方法?_Java_Oracle Coherence - Fatal编程技术网

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”一词)。以防你仍然找不到它: