Как именно работает метод equals () CharBuffer?
Я не могу понять конкретные детали 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 ответа
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
Две последовательности оставшихся элементов, рассматриваемые независимо от их начальных положений, точечно равны.
- Только глядя на остальные элементы,
- Не учитывая, с чего они начали,
- Каждый элемент одного буфера должен быть равен соответствующему элементу в другом буфере.
В вашем примере важна точечная равная часть:
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
Как видите, при точечном сравнении элементов буфера char они не совпадают.
Вот пример, который возвращает 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 - 'a','b',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). Понятно, что они не равны друг другу.