CharBuffer equals() 方法究竟是如何工作的?
How exactly CharBuffer equals() method works?
我无法理解 CharBuffer
equals()
方法运行的具体细节。
我不明白这个 "considered independently of their starting positions" 短语:
Two char buffers are equal if, and only if,
They have the same element type,
They have the same number of remaining elements, and
The two sequences of remaining elements, considered independently of
their starting positions, are pointwise equal.
我研究了这些很好的例子 - more examples,但我不明白这个想法。
任何人都可以用不同的词和最少的有见地的示例代码来解释吗?
我特别觉得奇怪:
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));
比较 CharBuffer
的 剩余 内容。这意味着 equals()
检查从 当前 缓冲区位置开始,而不是从缓冲区开始。根据 Buffer.position()
:
A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit.
像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
The two sequences of remaining elements, considered independently of their starting positions, are pointwise equal.
- 只看剩下的元素,
- 不考虑他们从哪里开始,
- 一个缓冲区的每个元素必须等于另一个缓冲区中的相应元素。
在您的示例中,重要的是 pointwise equal 部分:
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 缓冲区的元素时,它们不匹配。
这是一个 returns 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
比较cb1
的第2到7位的元素和cb2
的第4到9位的元素,两两相等(均包含以下 char
s - 'a','b',0,0,0,0).
可以看到两个buffer的起始位置不同(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 开始)。显然,它们彼此不相等。
我无法理解 CharBuffer
equals()
方法运行的具体细节。
我不明白这个 "considered independently of their starting positions" 短语:
Two char buffers are equal if, and only if,
They have the same element type,
They have the same number of remaining elements, and
The two sequences of remaining elements, considered independently of their starting positions, are pointwise equal.
我研究了这些很好的例子 - more examples,但我不明白这个想法。
任何人都可以用不同的词和最少的有见地的示例代码来解释吗?
我特别觉得奇怪:
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));
比较 CharBuffer
的 剩余 内容。这意味着 equals()
检查从 当前 缓冲区位置开始,而不是从缓冲区开始。根据 Buffer.position()
:
A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit.
像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
The two sequences of remaining elements, considered independently of their starting positions, are pointwise equal.
- 只看剩下的元素,
- 不考虑他们从哪里开始,
- 一个缓冲区的每个元素必须等于另一个缓冲区中的相应元素。
在您的示例中,重要的是 pointwise equal 部分:
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 缓冲区的元素时,它们不匹配。
这是一个 returns 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
比较cb1
的第2到7位的元素和cb2
的第4到9位的元素,两两相等(均包含以下 char
s - 'a','b',0,0,0,0).
可以看到两个buffer的起始位置不同(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 开始)。显然,它们彼此不相等。