场景:创建一个服务器,其中包含 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 r
在 addRoom
.
您是否正在尝试做某种多重映射,其中一个键可以映射到多个值?如果是这样,那么要么我们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
的问题因为他们的关键对象没有实现 hashCode
和 equals
契约(Contract)正确,但如果你使用 String
作为 key ,这应该不是问题。
顺便说一下,Hashtable
在 HashMap
有一个更新、更性感的表弟.我注意到 multithreading
问题中的标签,所以如果你真的需要 synchronized
功能,您可以使用 Collections.synchronizedMap
在任何一种情况下,无论您使用 HashMap
或 Hashtable
, 你要声明 myRooms
简单地作为 Map
(参见 Effective Java 第 2 版,第 52 条:通过接口(interface)引用对象)。
相关问题
关于java - 为什么我的 map 坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2894419/