我知道这听起来有点疯狂,但请解释一下我的意思:

我有一个Collection(例如HashSet),其中包含几个非常慢的初始化对象,并且我想查看Collection是否已经包含一个特定的对象。让我们以Vector3d为例(我知道初始化起来并不昂贵)。

因此Collection包含:

Vector3d(1,1,1)
Vector3d(2,1,1)
Vector3d(3,1,1)


我想问Collection问题“ Collection是否包含带有Vector3dx=2y=1z=1(即,我已经知道.contains()方法将针对的数据) 。因此,我可以创建一个新的Vector3d(2,1,1),然后在其上使用.contains(),但是正如我所说的,对象初始化很慢,或者我可以手动检查整个Collection(这是我现在正在做的)但这(据我所知)比.contains()慢,因为它不使用哈希,是否有更好的方法呢?

所讨论的对象是可变的,但equals方法所基于的数据却不是。 (在我的情况下,它们是x,y,z坐标的块,块的内容可能会更改,但x,y,z坐标不会改变)

最佳答案

如果只需要遍历所有元素或按位置访问元素,则ArrayList是正确的数据结构。这是错误的数据结构。

您想要做的就是快速回答包含问题,这就是“集”和“地图”的作用。用所需的简单哈希函数创建一个单独的,更便宜的Vector3dKey类,然后将昂贵的对象与Map< Vector3dKey, Vector3d >同时或代替ArrayList< Vector3d >插入到中,这将更加有意义。 Java显然不会保留昂贵的向量的两个副本,而仅保留引用的副本。当然,如果您的向量是可变的,那么整个方案就会崩溃。

10-06 14:52