我有一个程序可以从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));
}
}
答案 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对象更轻量级,并使键类型实际上清晰。