java - 为什么我的 map 坏了?

标签 java multithreading reference map hashtable

场景:创建一个服务器,其中包含 Room 对象,其中包含 User 对象。

我想通过 Id(字符串)将房间存储在某种 map 中。

期望的行为:

当用户通过服务器发出请求时,我应该能够通过库中的 ID 查找房间,然后将用户添加到房间,如果这是请求所需要的。

目前我在存储 map 的 Library.java 类中使用静态函数来检索房间:

public class Library {

  private static Hashtable<String, Rooms> myRooms = new Hashtable<String, Rooms>();

  public static addRoom(String s, Room r) {  
    myRooms.put(s, r);
  }

  public static Room getRoomById(String s) {
    return myRooms.get(s);
  }
}

在另一个类中,我将执行与 myRoom.addUser(user);

等效的操作

我使用 Hashtable 观察到的是,无论我将用户添加到 getRoomById 返回的房间多少次,该用户之后都不在房间里。

我认为在 Java 中,返回的对象本质上是对数据的引用,与 Hashtable 中具有相同引用的同一对象;但是,它不是那样的。有没有办法获得这种行为?也许用某种 wrapper ?我只是使用了错误的 map 变体吗?

帮忙吗?

最佳答案

很奇怪你声明了myRooms作为Hashtable<String, Rooms> (复数 Rooms ),但你 put单数Room raddRoom .

您是否正在尝试做某种多重映射,其中一个键可以映射到多个值?如果是这样,那么要么我们Guava实现,或实现您自己的 Map<K,Set<V>> (将键映射到一组值)。

不过,我不确定这是否是您的根本问题。

get的返回值是正确的应该是相同的对象,如引用相等性所定义的那样,与 put 中使用的对象相同.

    Object someObject = new Object();
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("key1", someObject);
    System.out.println(map.get("key1") == someObject); // prints "true"

    someObject = "something else";
    System.out.println(map.get("key1") == someObject); // prints "false"

以上是预期的行为。

有时人们会遇到 Map 的问题因为他们的关键对象没有实现 hashCodeequals契约(Contract)正确,但如果你使用 String作为 key ,这应该不是问题。

顺便说一下,HashtableHashMap 有一个更新、更性感的表弟.我注意到 multithreading问题中的标签,所以如果你真的需要 synchronized功能,您可以使用 Collections.synchronizedMap

在任何一种情况下,无论您使用 HashMapHashtable , 你要声明 myRooms简单地作为 Map (参见 Effective Java 第 2 版,第 52 条:通过接口(interface)引用对象)。

相关问题

关于java - 为什么我的 map 坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2894419/

相关文章:

来自修改后的集合的 Java 8 流

multithreading - Matlabpool 线程数与核心数

c# - 我可以在Java中通过引用传递参数吗?

c++ - 让一个引用成员引用另一个成员是否合法?

java - Spring安全角色和权限

java - 如何在 Android 中验证 IAP?

java - 使用 Stream DSL 在 Kafka Streams 中指定每个流/表时间戳提取器

javascript - 如何继承和重写angularjs(java pendent)中的 Controller 方法?

python - python 是并发编程的重要选择吗

c++ - 无法将成员变量设置为对象引用