2013-08-01 2 views
0

это моя проблема. Im хранит данные в таблице базы данных, в которой есть столбец, где я храню хэш-код (или может быть какой-то другой уникальной строкой, такой как идентификатор, потому что JVM может повторно находить объекты, меняя хэш-код). Но как только я получу эту строку, я хочу получить доступ к объекту, сопоставленному с этой Строкой. Я могу сделать это с HashMap, как:Как получить ссылку на объект с хэш-кодом или другой уникальной строкой в ​​Java

ConcurrentHashMap<String, MyClass> MyClassDictionary;

Средний объектов для хранения будет как +800. Я могу принять другие варианты, чтобы избежать таких вещей, но я действительно хочу знать, знают ли некоторые из вас лучший способ, чем использовать HashMap.

Я нашел кое-что о Referenceable интерфейсе, что я мог бы реализовать, вы можете проверить его в следующей ссылке: http://docs.oracle.com/javase/jndi/tutorial/objects/storing/reference.html

Спасибо за чтение.

ответ

0

Вы можете использовать любую клавишу в HashMap, которая является Immutable. Строка по своей природе является неизменной, что означает, что объект не может быть изменен, если кто-то попытается изменить объект, будет создан новый, а оригинал останется таким, какой он есть. Таким образом, вы безопасны, если используете уникальные строки в качестве ключа. Преимущество использования неизменяемых ключей в любой хешированной коллекции заключается в том, что ваш ключевой объект всегда будет сохранен или неизменен. И не будет никаких шансов, что кто-то по ошибке и изменит ключ, и приведет к проблеме, что вы потеряете ссылку на значение. Если ключ не является неизменным и изменен из другого места в коде. Тогда вы никогда не сможете получить связанное значение с этим ключом. Это иногда называют утечкой памяти в java.

+0

Да, я пойду с этим. Идентификатор или что-то, чтобы искать объекты на Карте. Спасибо за ответ. – GabrielBB

+0

@ user2561119 Если вы найдете мой ответ, вы можете принять его, нажав на галочку слева до моего ответа. Эта практика помогает другим сталкиваться с одной и той же проблемой. –

+0

Я хотел, но у меня нет достаточной репутации, чтобы повысить его – GabrielBB

0

hashCode объекта очень явно не уникален; для вашего метода hashCode() вполне законно возвращать 0 все время. Вам нужно будет использовать другой идентификатор.

Вы выглядите так, что здесь вы пересекаете две отдельные проблемы: хранятся ли ваши объекты в базе данных или только в памяти? Если они только в памяти, то нет причин помещать идентификатор в базу данных, потому что объекты будут выброшены, когда программа перезагрузится. Если они находятся в базе данных, вам нужно какое-то решение объектно-реляционного сопоставления для воссоздания объектов Java из строк базы данных, и вы должны посмотреть на JPA.

+0

Спасибо за ответ. Я использую JPA для сопоставления некоторых строк с Entities с EclipseLink. Но объект, о котором я говорил, представляет собой представление Клиента на Сервере (он имеет Socket для связи, порт, ip и т. Д.), Поэтому я хотел, чтобы этот сокет что-то сказал подключенному клиенту, хранящему IP в базе данных, а затем получить ссылочный объект или сокет с этим IP-адресом, не сохраняя их в списке или HashMap – GabrielBB

+1

. Таким образом, вы хотите иметь некоторое состояние переходного процесса (например, открытый сокет), связанное с объектом базы данных, и искать переходный объект с использованием идентификатора постоянного объекта? Использование «Карты» в некотором роде - лучший вариант; 800 объектов на самом деле не проблема. – chrylis

+1

Точно. Да, я собираюсь пойти с Картой, как вы говорите. Поскольку, если я создаю карту или нет, 800 объектов по-прежнему находятся в памяти, поэтому на карте будут просто ссылки на эти объекты. Спасибо за ответ. – GabrielBB