检查字节数组列表是否包含新的字节数组

时间:2019-03-22 12:18:03

标签: java arrays list collections byte

我有一个字节数组列表,需要检查该列表是否包含新的给定字节数组。如果没有,那么我需要执行一些操作。

现在,我正在尝试这样做:

List<byte[]> listOFByteArrays = getListOfByteArrays();
byte[] newByteArray = getNewByteArray();

if (!listOfByteArrays.contains(newByteArray)){
// do some action
}

这对我不起作用,无论如何它都会在if语句中执行此some action

我做错了什么,正确的检查方法是什么?

谢谢。

4 个答案:

答案 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
    }
}