我有一个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。 数据结构的偏好应该是什么才能使其性能密集,换句话说,它可能会有昂贵的插入。
答案 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
实现,可以做你想要的,但我最好的建议就是使用谷歌并希望他们擅长搜索引擎优化。