我有两个字节数组列表,我希望使用removeAll / retainAll来获取一些有意义的数据,但它似乎不起作用。如果我首先将字节数组转换为字符串,它确实按预期工作,但是我使用的数据量非常昂贵,特别是考虑到我需要稍后转换回字节数组。是否有retainAll / removeAll的替代方法可以在不先转换为字符串的情况下使用?
答案 0 :(得分:1)
retainAll
/ removeAll
不适用于数组并且与String
一起使用的原因是字符串正确地比较了相等性,而字节数组比较了身份相等性。
不是转换为String
而是返回,而是在字节数组周围构建一个包装类型。您的包装器需要使用数组中的数据来支持hashCode
和equals
。将这些包装器保留在集合而不是原始字节数组中会使您的数组彼此相当,因此retainAll
/ removeAll
将再次起作用。
class ByteArrayWrapper {
private final byte[] data;
private int hc;
public ByteArrayWrapper(byte[] data) {
this.data = data;
for (int i = 0 ; i != data.length ; i++) {
hc = 31*hc + data[i];
}
}
public byte[] getData() {
return data;
}
@Override
public int hashCode() {
return hc;
}
@override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof ByteArrayWrapper)) return false;
ByteArrayWrapper other = (ByteArrayWrapper)obj;
if (other.data.length != data.length) return false;
for (int i = 0 ; i != data.length ; i++) {
if (data[i] != other.data[i]) return false;
}
return true;
}
}