-2

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

说:

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

假设我有以下值:

    核心价值
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")

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

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

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

4

2 回答 2

2

您可以使用一种称为实习的技术,该技术本质上是将所有equal()相互关联的对象映射到单个授权实例。

这在 Java 中用于使用String.intern().

但是使用这种方法有一些缺点('尽管现代 JVM 已经减少了很多)。作为替代方案,您可以使用Guava界面Interner

Interner只需使用Interners帮助类创建一个:

实习生 strInterner = Interners.newStrongInterner();

并通过内部传递每个String值,然后在键值中使用它:

String v1 = strInterner.intern(param1);

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

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

于 2013-08-26T13:56:57.080 回答
1

好吧,如果你将同一个对象放入映射中的两个键,那么它们都是同一个对象。如果您有.equals()彼此相关的对象的不同实例,它会变得更有趣。您可以尝试使用Flyweight您的值对象,或者您可以遍历values()地图 - 如果您找到一个equals()值对象,请将您的键与该对象而不是传入的对象放在一起。

某个地方的某个人可能已经编写了一个Map可以满足您要求的实现,但我最好的建议是使用 Google 并希望他们擅长 SEO。

于 2013-08-26T13:50:14.273 回答