我有一个使用数据结构的应用程序Point
。假设总共有50个不同的实例Point
(含义p1.equals(p2)
== false)。但是,在计算过程中会创建新实例的负载,这些负载实际上与已实例化的对象相同。
存储这些实例时,这会对内存消耗产生重大影响:50个不同的Point
s由500'000个实例表示Point
。在数据结构中,没有什么可以阻止对现有实例的重用。因此,我创建了一个缓存:
HashMappointCache = new HashMap<>();
因此,我可以检查该点是否存在,如果不存在则添加它。但是,由于键和值本质上相同,因此这种缓存似乎有点过大。
此外,我已经有一张地图了:
HashMapflag = new HashMap<>();
我很好奇的是:是否存在可以用于flag
检索密钥的类似数据结构的映射?如果没有,我可以将其他数据结构用于缓存,更像是集合,并可以轻松进行检查和检索吗?
编辑:为了完整起见,Point
我正在使用的类是javafx.geometry.Point2D
,因此我无法更改。
为了得到这个答案,让我们假设a的唯一性Point
是由两个int坐标x和y决定的(您可以轻松地对其进行更改,以适应确定您Point
的唯一性的实际参数)。
您不想创建Point
实例来确定该实例是否Point
已经存在于HashSet
或中HashMap
。这样做避免了避免创建多个实例的目的(尽管使用HashMap
或HashSet
会阻止您保留所有这些重复的实例,并且GC会很快释放它们,因此足以解决内存消耗问题)。
我建议您Point getPoint(int x,int y)
在Point
类中使用静态方法。该方法将在静态内部内部检查HashMap
那些x,y坐标是否已经具有对应的Point
实例并返回该实例。如果实例不存在,则会创建该实例并将其添加到中HashMap
。
这类似于Integer.valueOf(int)
对小整数的处理-它返回一个缓存的Integer
实例,而不是创建一个新的实例。