2014-11-10 2 views
0

поэтому у меня есть список List<byte[]> позволяет говорить «fullList», в результате чего какой-то другой фрагмент кода генерирует другой список, содержащий некоторый byte[] partialList. поэтому я использую метод .contain, который всегда терпит неудачу для поиска полученного байта [] в partialList из fullList. Почему это??содержит метод для списка массива байтов

List<byte[]> fullList = {some byte[] arrays added here..} 
List<byte[]> partialList = {some byte[] arrays added here..} 

byte[] toCheck = partialList.get(0); 
System.out.println("The check is "+ fullList.contains(tocheck)); 
+0

Потому что это не в список? –

+0

Я знаю, что байт [] должен быть в списке. Я создаю их обоих. –

+0

Вы создаете два списка, используя разные фрагменты кода. Затем вытащите элемент и спросите, находится ли он в * третьем * списке ('leafs'). И укажите * no * информацию о том, что находится в * любом * из этих списков. –

ответ

4

Проблема заключается в том, что Java массивы do not implement equals properly, т.е. два массива считаются «равны» только тогда, когда их адрес памяти такой же, то есть, если они точно такой же ссылка на объект.

byte[] foo = {1,2,3}; 
byte[] bar = {1,2,3}; 
System.out.println(foo.equals(bar)); // prints 'false' 

Чтобы обойти эту проблему, можно либо кодировать те byte[] как числа и использовать List<Integer> (или Long) вместо этого, или реализовать свой собственный содержит метод с использованием Arrays.equals

boolean contains(List<byte[]> arrays, byte[] other) { 
    for (byte[] b : arrays) 
     if (Arrays.equals(b, other)) return true; 
    return false; 
} 
+0

Итак, после каждого хэша sha-256 я получаю (который я заполняю список), я кодирую его на некоторые цифры. Хорошо, спасибо.. –

Смежные вопросы