Java.util.Arrays.equals() с ограниченной длиной

Мне нужно сравнить элементы двух байтовых [] массивов, но только до фиксированной длины. Для целых массивов я использую java.util.Arrays.equals(). Конечно, я могу скопировать субдиапазоны (Arrays.copyOf()), но я бы не хотел этого делать. Я также уверен, что должен быть стандартный способ сделать это без применения новой утилиты.

Мне нужно формально что-то вроде:

java.util.Arrays.equals(byte[] a, byte [] b, int length)

Любая точка к чему-то известному? Я не вижу широко используемого подхода.

Снова о том, что требуется, чтобы предотвратить ложные ответы:  - Массив равен предел по длине.  - У меня есть ручная реализация, но я бы хотел заменить ее чем-то стандартным.  - Я не хочу никакой копии.

Спасибо заранее.

Ответ 1

ByteBuffer предоставляет нечто похожее на то, что предложил @meriton, но может работать с примитивами. Вот иллюстративный код:

import java.nio.ByteBuffer;

public class Main {

    public static void main(String [] args) throws Exception {

        byte [] a1 = {0, 1, 0, 1};
        byte [] a2 = {0, 0, 1, 0};

        boolean eq = ByteBuffer.wrap(a1,0,3).equals(ByteBuffer.wrap(a2,1,3));
        System.out.println("equal: " + eq);
    }
}

Свойства ответа @meriton:

  • Результат - это сбор с полной степенью их использования.
  • На самом деле это несколько копия (но не полная).
  • Требуется ссылки, примитивы не могут быть обернуты таким образом.

Этот ответ подходит.

  • Бэкэнд-массив НЕ ИЗМЕНЕН. ByteBuffer.array() возвращает ссылка на исходный массив (может быть недостатком, может быть преимущество).
  • Он работает с примитивами.

Ответ 2

Вы можете сделать:

Arrays.asList(a).subList(0,n).equals(Arrays.asList(b).subList(0,n))

Ответ 3

Вы можете основывать свой метод на исходном коде Arrays.equals.

public static boolean equals(byte[] a, byte[] a2, int length) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
    }

Ответ 4

Почему бы не тривиально реализовать это самостоятельно?

public static void firstNEqual(byte[] a, byte[] b, int n) {
    assert a.length >= n && b.length >= n;

    for(int i = 0; i < n; i++)
        if(a[i] != b[i])
            return false;
    return true;
}

Почему вы думаете, что должен быть встроен метод утилиты? Что, если мое состояние a[1:4] == b[0:3]? Является ли это более читаемым как Arrays.subrangesEqual(a, b, 1, 0, 3) или как явный цикл цикла:

for(int i = 1, j = 0, count = 0; count < 3; count++, i++, j++)
    if(a[i] != b[j])
        return false;
return true;