Как именно работает метод equals () CharBuffer? - PullRequest
0 голосов
/ 03 января 2019

Я не могу понять конкретные детали функционирования метода CharBuffer equals().

Я не понимаю этого слова "независимо от их исходных позиций":

Два символьных буфера равны, если и только если ,

Они имеют одинаковый тип элемента,

Они имеют одинаковое количество оставшихся элементов, и

две последовательности оставшихся элементов, рассматриваемые независимо от их начальных положений , точечно равны.

Я изучаю эти хорошие примеры - подробнеепримеры , но я не понимаю эту идею.

Может ли кто-нибудь объяснить с помощью разных слов и с минимальным проницательным кодом примера?

Особенно мне кажется это странным:

CharBuffer cb1 = CharBuffer.allocate(10);
cb1.put('a');
cb1.put('b');
//cb1.rewind();
System.out.println(cb1);


CharBuffer cb2 = CharBuffer.allocate(10);
cb2.put(4,'a');
cb2.put(5,'b');
//cb2.rewind();
System.out.println(cb2);

// false, uncommenting rewind() - also false
// but shall be true - "considered independently of starting positions" ?
System.out.println(cb1.equals(cb2));  

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Две последовательности оставшихся элементов , , рассматриваемые независимо от их начальных позиций , точечно равны .

  1. Только глядя на остальные элементы,
  2. Без учета того, с чего они начали,
  3. Каждый элемент одного буфера должен быть равен соответствующему элементу в другом буфере.

В вашем примере важна точечно равная часть:

      0 1 2 3 4 5 6 7 8 9
cb1 = a b 0 0 0 0 0 0 0 0
cb1 = 0 0 0 0 a b 0 0 0 0

Как видите, при точечном сравнении элементов буфера символов они не совпадают.

0 голосов
/ 03 января 2019

Вот пример, который возвращает true для двух буферов разных размеров:

CharBuffer cb1 = CharBuffer.allocate(8);
cb1.put('x'); // moves the current position to 1
cb1.put('x'); // moves the current position to 2
cb1.put(2,'a');
cb1.put(3,'b');
System.out.print(cb1);System.out.println ('|');
CharBuffer cb2 = CharBuffer.allocate(10);
cb2.get (); // moves the current position to 1
cb2.get (); // moves the current position to 2
cb2.get (); // moves the current position to 3
cb2.get (); // moves the current position to 4
cb2.put(4,'a');
cb2.put(5,'b');
System.out.print(cb2);System.out.println ('|');
System.out.println(cb1.equals(cb2));

equals сравнивает элементы в позициях 2–7 из cb1 с элементами в позициях 4–9 из cb2 и обнаруживает, что они попарно равны (оба содержат следующие char s - 'а', 'б', 0,0,0,0).

Вы можете видеть, что начальная позиция отличается в двух буферах (2 против 4), но последовательности оставшихся элементов одинаковы.

     0   1   2   3  4   5  6 7 8 9

cb1 'x' 'x' 'a' 'b' 0   0  0 0
             ^
cb2  0   0   0   0 'a' 'b' 0 0 0 0
                    ^

Когда вы начинаете сравнивать последовательности из начальной позиции, вы получаете две идентичные последовательности.

В вашем примере вы сравниваете последовательность 0,0,0,0,0,0,0,0 (последовательность оставшихся элементов начинается с позиции 2) с последовательностью 0,0,0,0, ' a ',' b ', 0,0,0,0 (последовательность оставшихся элементов начинается с позиции 0). Понятно, что они не равны друг другу.

0 голосов
/ 03 января 2019

CharBuffer сравнивается по их оставшемуся содержимому. Это означает, что проверка equals() начинается с текущей позиции буфера, а не с начала буфера. Согласно Buffer.position():

Позиция буфера - это индекс следующего элемента для чтения или записи. Позиция буфера никогда не бывает отрицательной и никогда не превышает своего предела.

Некоторые методы, такие как put(char), изменят позицию буфера:

CharBuffer cb1 = CharBuffer.allocate(10);
cb1.put('a'); // increments position
cb1.put('b'); // increments position

CharBuffer cb2 = CharBuffer.allocate(8);

System.out.println(cb1.equals(cb2)); // true, 00000000 equals 00000000

В вашем примере после cb1.rewind() первый буфер равен ab00000000, а второй - 0000ab0000. Вызов cb2.rewind() не требуется, поскольку put(char, int) не меняет позицию буфера:

CharBuffer cb1 = CharBuffer.allocate(10);
cb1.put((char) 0);
cb1.put((char) 0);
cb1.put((char) 0);
cb1.put((char) 0);
cb1.put('a');
cb1.put('b');
// put(char) increments position so we need to rewind
cb1.rewind(); 

CharBuffer cb2 = CharBuffer.allocate(10);
cb2.put(4, 'a');
cb2.put(5, 'b');

System.out.println(cb1.equals(cb2)); // true, 0000ab0000 equals 0000ab0000
...