我有一个字节数组列表,需要检查该列表是否不包含新的给定字节数组。如果没有,那么我需要执行一些操作。
现在,我正在尝试这样做:
List<byte[]> listOFByteArrays = getListOfByteArrays();
byte[] newByteArray = getNewByteArray();
if (!listOfByteArrays.contains(newByteArray)){
// do some action
}
这对我不起作用,无论如何它都会在if语句中执行此some action
。
我做错了什么,正确的检查方法是什么?
谢谢。
答案 0 :(得分:1)
Java的.contains(T)
仅对参数执行相等检查。但是,一个数组不等于包含相同值的另一个数组,因为没有检查所有值,并且比较是在它们的指针上完成的。
由于您已经有两个byte[]
,所以令人毛骨悚然(但实用)的方法可能是简单地...遍历列表,并使用java.util.Arrays.equals()
,它对原始数组产生了奇迹。
List<byte[]> listOFByteArrays = getListOfByteArrays();
byte[] newByteArray = getNewByteArray();
boolean flag = false;
for(byte[] b : listOFByteArrays) {
if(Arrays.equals(b,newByteArray)) {
flag = true;
break;
}
}
if (!flag){
// do stuff
}
答案 1 :(得分:1)
List.contains
方法使用equals
检查列表是否包含特定元素。
来自javadoc:
如果此列表包含指定的元素,则返回true。更正式地讲,当且仅当此列表包含至少一个与Objects.equals(o,e)相同的元素e时,才返回true。
但是对于数组,equals
方法与==
相同。这就是contains
即使内容相同也返回false的原因。请改用Arrays.equals
:
for (byte[] arr : listOfByteArrays) {
if (Arrays.equals(arr, newByteArray )) {
}
}
答案 2 :(得分:1)
您可以尝试
if (!listOFByteArrays
.stream()
.anyMatch(byteArray -> Arrays.areEqual(byteArray, newByteArray))) {
// do some action
}
答案 3 :(得分:0)
您正在寻找:
for (int i = 0; i < listOfByteArrays.size(); i++) {
if (Arrays.equals(newByteArray, listOfByteArrays.get(i))) {
//do some action
}
}