使用String(byte [])作为映射

时间:2015-07-29 12:47:18

标签: java

我有一个程序可以从byte[]返回的数据库中获取ID。我想使用这些ID(字节数组)作为地图的键。默认情况下,这不起作用,因为比较的是"对象相等"不是"内容平等"。

我尝试似乎工作的下一件事是使用new String(byte[])构造函数实例化一个String。当这个似乎工作时,我知道我做了一些可能很狡猾的事情。我没有指定依赖于系统默认值的编码。我也不知道所有字节序列是否都会在每个编码中都有表示。

"转换"为了byte[]String保险箱的目的,map.put()map.get()?是否有边缘情况我没有考虑这种方法无意中造成碰撞的位置(其中2个不同内容的byte[]可能会变得相同String)。

注意:地图存储在内存中,仅适用于单个应用程序运行。 我编写的简单包装类,如果这种方法可行,可以让我的生活更轻松:

public class Cache {

    Map<String, Set<String>> cache = new HashMap<String, Set<String>>();

    public Cache() {}

    public void put(byte[] key, Set<String> value) {
        cache.put(new String(key), value);
    }

    public Set<String> get(byte[] key) {
        return cache.get(new String(key));
    }
}

2 个答案:

答案 0 :(得分:6)

您应该使用Biginteger。它有一个BigInteger(byte[])构造函数,并且有一个有效的比较系统。

答案 1 :(得分:2)

您是否可以围绕byte[]数组构建一个简单的包装器?

类似于:

public class CacheKey {
    private final byte[] key;

    public CacheKey(byte[] key) {
        this.key = key; // You may want to do a defensive copy here
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        CacheKey cacheKey = (CacheKey) o;
        return Arrays.equals(key, cacheKey.key);
    }

    @Override
    public int hashCode() {
        return key != null ? Arrays.hashCode(key) : 0;
    }
}

并将其用作地图键?它比使用内置的String对象更轻量级,并使键类型实际上清晰。