Очень странно, что вы объявляете 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
контракт должным образом, но если вы используете String
в качестве ключей, это не должно быть проблемой.
Кстати, у Hashtable
есть более новая, более сексуальная кузина в HashMap
. Я заметил тег multithreading
в вопросе, поэтому, если вам действительно нужна функция synchronized
, вы можете использовать Collections.synchronizedMap
В любом случае, независимо от того, используете ли вы HashMap
или Hashtable
, вы хотите объявить myRooms
просто как Map
(см. Effective Java 2nd Edition, Item 52: Ссылки на объекты по интерфейсы ).
Смежные вопросы