当前位置:  开发笔记 > 编程语言 > 正文

重用缓存的实例

如何解决《重用缓存的实例》经验,为你挑选了1个好方法。

我有一个使用数据结构的应用程序Point。假设总共有50个不同的实例Point(含义p1.equals(p2)== false)。但是,在计算过程中会创建新实例的负载,这些负载实际上与已实例化的对象相同。

存储这些实例时,这会对内存消耗产生重大影响:50个不同的Points由500'000个实例表示Point。在数据结构中,没有什么可以阻止对现有实例的重用。因此,我创建了一个缓存:

HashMap pointCache = new HashMap<>();

因此,我可以检查该点是否存在,如果不存在则添加它。但是,由于键和值本质上相同,因此这种缓存似乎有点过大。

此外,我已经有一张地图了:

HashMap flag = new HashMap<>();

我很好奇的是:是否存在可以用于flag检索密钥的类似数据结构的映射?如果没有,我可以将其他数据结构用于缓存,更像是集合,并可以轻松进行检查和检索吗?

编辑:为了完整起见Point我正在使用的类是javafx.geometry.Point2D,因此我无法更改。



1> Eran..:

为了得到这个答案,让我们假设a的唯一性Point是由两个int坐标x和y决定的(您可以轻松地对其进行更改,以适应确定您Point的唯一性的实际参数)。

您不想创建Point实例来确定该实例是否Point已经存在于HashSet或中HashMap。这样做避免了避免创建多个实例的目的(尽管使用HashMapHashSet会阻止您保留所有这些重复的实例,并且GC会很快释放它们,因此足以解决内存消耗问题)。

我建议您Point getPoint(int x,int y)Point类中使用静态方法。该方法将在静态内部内部检查HashMap>那些x,y坐标是否已经具有对应的Point实例并返回该实例。如果实例不存在,则会创建该实例并将其添加到中HashMap

这类似于Integer.valueOf(int)对小整数的处理-它返回一个缓存的Integer实例,而不是创建一个新的实例。

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有