Java 具有xyz密钥的容器

Java 具有xyz密钥的容器,java,containers,Java,Containers,我需要一个fast容器来存储Java中的对象,对象具有(静态)XYZ坐标,所有对象都具有不同的坐标。基本上是一个网格,但它可能不以0,0,0为中心(网格中可能缺少部分) 我尝试使用一个以整数为键的地图,并对坐标进行位移,这样它会为每个坐标创建一个唯一的数字。但是,当数字高于255(8位)时,这个结果就不太好了 此外,数组也不能用作键,因为映射实际上并不查看数组的值,而是查看引用。我也可以使用字符串作为键,但是每次我想要访问一个对象时,我都需要(重新)构建一个字符串 现在我使用一个ArrayLis

我需要一个fast容器来存储Java中的对象,对象具有(静态)XYZ坐标,所有对象都具有不同的坐标。基本上是一个网格,但它可能不以0,0,0为中心(网格中可能缺少部分)

我尝试使用一个以整数为键的地图,并对坐标进行位移,这样它会为每个坐标创建一个唯一的数字。但是,当数字高于255(8位)时,这个结果就不太好了

此外,数组也不能用作键,因为映射实际上并不查看数组的值,而是查看引用。我也可以使用字符串作为键,但是每次我想要访问一个对象时,我都需要(重新)构建一个字符串


现在我使用一个ArrayList并循环遍历所有键,但这真的很慢。那么,存储对象的最快(和内存效率最高)方法是什么呢?

创建一个自定义类,使用自定义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;
    }
}
只需确保永远不会更改用作键的实例的值


这并不比使用简单整数差多少。它仍然是有效的固定时间访问。

您是在循环访问以获取某些信息吗?那是什么?你的x、y和z不能与所有对象都不同,因为它们是静态的。@Bheshgurhung什么?对象的xyz值不会更改。但是所有的对象都有不同的值。我确实尝试过这个,但是我在使用hashCode方法时遇到了麻烦。我做了一些类似
x的事情,其目的是因为hashmap存储值的方式。它通常有偶数个bucket(因为当需要扩展时,它的容量会翻倍),为了确定条目的存储位置,它将根据bucket的数量对hashcode进行模数转换。如果将任一坐标乘以与桶数共享一个素因子的任何东西,则位于同一轴或平面上的东西最终将位于同一个桶中,这在最坏的情况下会将地图变成一个具有O(n)访问权限而不是O(1)访问权限的列表。它本身是一个相当大的主题。查找哈希表、哈希函数和collison。此外,出于同样的原因,使用异或运算符(^)比按位或(|)要好得多。感谢您的解释,我现在有点理解了。我会对你说的话做进一步的研究。