在HashMap中的值中指向/引用相同Object的多个键

时间:2013-08-26 13:28:56

标签: java data-structures collections

我有一个HashMap,它有一个Object(有2个String对象作为它的成员变量),值为Object,包含3个不同的字符串。

说:

Map<ReqDTO , RespDTO> map = new HashMap<ReqDTO ,RespDTO> ();

假设我有以下值:

    KEY             VALUE
1 ("str1","1") -  ("1","2","3")
2 ("str2","2") -  ("a","b","c")
3 ("str3","3") -  ("1","2","3")
4 ("str4","4") -  ("v","b","g")
5 ("str5","5") -  ("1","2","3")

当我有数千条这样的记录(在我的应用程序中是Cache)时,记录号的NUMUE部分:1,3,5保存3个对象的内存。我想让1,3,5条记录的KEYS指向VALUES的相同实例(在本例中为1,2,3)而不是单独的内存。

HashMap中是否有相同的变体?或任何其他数据结构将...

注意:它只加载一次,并且对此执行的所有操作都只是READ。 数据结构的偏好应该是什么才能使其性能密集,换句话说,它可能会有昂贵的插入。

2 个答案:

答案 0 :(得分:2)

您可以使用一种名为interning的技术,它实质上将equal()的所有对象相互映射到一个授权实例。

使用String.intern()在Java中用于字符串。

但是使用这种方法有一些缺点('虽然现代JVM已经减少了很多)。您也可以使用Guava界面Interner

使用Interners帮助程序类创建一个Interner

Interner strInterner = Interners.newStrongInterner();

并将每个String值传递给interner,然后在键中使用它:

String v1 = strInterner.intern(param1);

对于任何给定值,您只能使用1 String个实例。对于任何其他类也可以这样做(只要它正确实现equals()并且是不可变的)。

您甚至可以在构建地图后丢弃Interner

答案 1 :(得分:0)

好吧,如果你将同一个对象放入两个键的映射中,那么它们都将是同一个对象。如果对象具有彼此.equals()的不同实例,则会更有趣。您可以尝试使用Flyweight作为您的值对象,或者您可以遍历地图的values() - 如果您找到equals()值对象,请将您的密钥放在该对象上而不是一个人进去了。

有人,某个地方可能已经编写了Map实现,可以做你想要的,但我最好的建议就是使用谷歌并希望他们擅长搜索引擎优化。