java - RMI - 引用并使用远程对象作为 HashMap 中的 "key"

标签 java hashmap rmi

我有一个 RMI 服务器,它导出实现接口(interface)的对象,我们将其称为“TestInterface”。

然后,客户端可以通过调用此接口(interface)上的方法来执行各种任务。然后,我为不同类型的对象提供了一些其他接口(interface),其中一个方法采用“TestInterface”类型的对象。该方法尝试使用以“TestInterface”为键的 HashMap (它存储服务器上所有“TestInterface”对象的 HashMap ,该值是我想要检索的值),但无法找到它。我知道这个键存在于 HashMap 中,但是由于接口(interface)被传递到客户端,然后又返回到服务器,所以似乎找不到它。

我知道它存在,因为我能够打印出作为 HashMap 中的键的对象的 ID,以及传入的“TestInterface”的 ID(它们是相同的)。然后我将它们都打印出来(使用默认的 toString),我得到了这个:

Proxy[TestInterface,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[127.0.0.1:1099](remote),objID:[-38c943f9:14be569cb95:-7ff9, 8183237023004091504]]]]]

Test[UnicastServerRef [liveRef: [endpoint:[127.0.0.1:1099](local),objID:[-38c943f9:14be569cb95:-7ff9, 8183237023004091504]]]]

我可以看到它们是不同的,这可能就是我无法查找它们的原因。然而,它们看起来指向同一个对象(我相信情况就是这样,因为 objectId 是相同的)。

我的问题是,为什么我不能在 HashMap 中查找这个“Key”,其中 Key 是对同一对象的引用。

我的第二个问题是,有没有简单的方法来解决这个问题?

最佳答案

发生这种情况是因为您用作键的实际对象与 hashCode()equals() 的计算结果不同。这些是 HashMap 用于查找的方法。处理此问题的常见方法是创建一个包装类,该类将使用 hashCode()equals() 内的内部 objId。然后,该包装类将用作 map 的键。

类似于:

public Wrapper {
  private Keyclass key;
  ...

  public Keyclass getWrapped() { return key; }

  @Override
  public int hashCode() {
    return key.objID.hashCode();
  }

  @Override
  public boolean equals(Object o) {
    return key.objID.equals(((Wrapped)o).key.objID);
  }
}

关于java - RMI - 引用并使用远程对象作为 HashMap 中的 "key",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28858670/

相关文章:

java - Java 中的简单凯撒密码

java - 当使用自定义类对象作为 HashMap 的键时,从 Java HashMap 随机访问一个值?

lisp - 普通口齿不清 : getting all keys of a given hash table as a list

java - 给定 HashMap 中的键,如何更新值?

Java RMI 的 UnicastRemoteObject

java - Eclipse 说<终止>,不知道为什么

通过方法进行 Java 自动装箱

java - 带有列表和 putIfAbsent 的通用 HashMap

java - 客户端收到未声明的已检查异常,但已声明异常被捕获

java - Tomcat 内存使用量在 IDLE 中增长