我需要一个快速容器来存储Java中的对象,这些对象具有(静态)XYZ坐标,并且所有对象具有不同的坐标。基本上是网格,但它可能不以0,0,0为中心(并且网格中可能缺少部分)。
我尝试使用带有整数的Map作为键并对位移进行位移,以便为每个坐标创建唯一的数字。但是当数字高于255(8位)时,这并没有太好用。
此外,数组不能作为键,因为映射实际上不会查看数组的值,而是查看引用。我也可以使用String作为键,但每次我想访问一个对象时,我都需要(重新)构建一个String。
现在我正在使用ArrayList并循环遍历所有键,但这确实很慢。那么存储对象的最快(和内存效率)方式是什么?
答案 0 :(得分:2)
创建一个自定义类,使用自定义hashCode()和equals()方法作为键。
public static class Vertex {
public int x, y, z;
public boolean equals(Object o){
if(this == o) return true;
if(!(o instanceof Vertex)) return false;
Vertex v = (Vertex)o;
return x == v.x && y == v.y && z == v.z;
}
public int hashCode(){
// Use whatever prime numbers you like
return x ^ y * 137 ^ z * 11317;
}
}
请确保永远不会更改您用作密钥的实例的值。
这并不比使用简单整数差。它仍然是有效的恒定时间访问。