Java 字节数组列表的Retainal/removeAll替代方案?
我有两个字节数组列表,我希望使用removeAll/retainal来获得一些有意义的数据,但它似乎不起作用。如果我首先将字节数组转换为字符串,它确实可以按预期工作,但是对于我正在处理的数据量来说,这是非常昂贵的,特别是考虑到我以后需要转换回字节数组。是否有一种替代Retainal/removeAll的方法可以在不首先转换为字符串的情况下使用?原因是Java 字节数组列表的Retainal/removeAll替代方案?,java,list,Java,List,我有两个字节数组列表,我希望使用removeAll/retainal来获得一些有意义的数据,但它似乎不起作用。如果我首先将字节数组转换为字符串,它确实可以按预期工作,但是对于我正在处理的数据量来说,这是非常昂贵的,特别是考虑到我以后需要转换回字节数组。是否有一种替代Retainal/removeAll的方法可以在不首先转换为字符串的情况下使用?原因是Retainal/removeAll不适用于数组,而适用于strings是字符串比较是否正确,而字节数组比较是否一致 与其转换为字符串,还不如围绕字
Retainal
/removeAll
不适用于数组,而适用于string
s是字符串比较是否正确,而字节数组比较是否一致
与其转换为字符串,还不如围绕字节数组构建一个包装器类型。包装器需要使用数组中的数据支持hashCode
和equals
。将这些包装器保留在集合中而不是原始字节数组将使数组彼此具有可比性,因此retainal
/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;
}
}
retainal
/removeAll
不适用于数组,而适用于String
s的原因是字符串比较是否正确,而字节数组比较是否相等
与其转换为字符串,还不如围绕字节数组构建一个包装器类型。包装器需要使用数组中的数据支持hashCode
和equals
。将这些包装器保留在集合中而不是原始字节数组将使数组彼此具有可比性,因此retainal
/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;
}
}
列表呢?列表呢?这真的很有帮助。非常感谢你!这真的很有帮助。非常感谢你!