我知道这听起来有点疯狂,但请解释一下我的意思:
我有一个Collection
(例如HashSet),其中包含几个非常慢的初始化对象,并且我想查看Collection
是否已经包含一个特定的对象。让我们以Vector3d
为例(我知道初始化起来并不昂贵)。
因此Collection
包含:
Vector3d(1,1,1)
Vector3d(2,1,1)
Vector3d(3,1,1)
我想问
Collection
问题“ Collection
是否包含带有Vector3d
,x=2
和y=1
的z=1
(即,我已经知道.contains()
方法将针对的数据) 。因此,我可以创建一个新的Vector3d(2,1,1)
,然后在其上使用.contains()
,但是正如我所说的,对象初始化很慢,或者我可以手动检查整个Collection
(这是我现在正在做的)但这(据我所知)比.contains()
慢,因为它不使用哈希,是否有更好的方法呢?所讨论的对象是可变的,但
equals
方法所基于的数据却不是。 (在我的情况下,它们是x,y,z坐标的块,块的内容可能会更改,但x,y,z坐标不会改变) 最佳答案
如果只需要遍历所有元素或按位置访问元素,则ArrayList是正确的数据结构。这是错误的数据结构。
您想要做的就是快速回答包含问题,这就是“集”和“地图”的作用。用所需的简单哈希函数创建一个单独的,更便宜的Vector3dKey
类,然后将昂贵的对象与Map< Vector3dKey, Vector3d >
同时或代替ArrayList< Vector3d >
插入到中,这将更加有意义。 Java显然不会保留昂贵的向量的两个副本,而仅保留引用的副本。当然,如果您的向量是可变的,那么整个方案就会崩溃。