具有不同 "element type"(根据定义不相等)的 CharBuffer 对象是什么?
What are CharBuffer objects with different "element type" (not equal by definition)?
CharBuffer
的equals()
方法相当棘手。
从 我知道它使 逐个字符(或逐个元素?? ?) 以下块的比较:从(起始)位置(由 position()
返回)包含到 limit()
不包含。 两个 CharBuffer(s) 中的容量和位置之前和限制之后的任何内容都没有通过 equals() 方法进行分析。
但是短语“相同的元素类型”和“...元素...逐点”打败我。
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.
我还缺少什么?什么是元素类型? CharBuffer里面不是一直都是char吗?
P.S。根据实现代码 (Java SE8) 实际上没有(元素)类型检查在 equals(obj) 中完成——只有标准检查 if (obj instanceof CharBuffer)
。所以 API 中的这个短语只是为了将来的一些实现或者我不知道是什么。或者 "same element type" 只是意味着 equals(arg) - arg 必须是 CharBuffer,这是微不足道的。
能否举例说明两个不同"element type"的CharBuffer对象?
根据定义,此类 CharBuffer 对象不相等。
CharBuffer cb1 = CharBuffer.allocate(10);
cb1.put('0');
cb1.put('a'); // element type - char ?
cb1.put('b');
cb1.rewind();
cb1.limit(7);
System.out.println(cb1);
CharBuffer cb2 = CharBuffer.allocate(11);
cb2.put("0ab"); // element type - String ?
cb2.rewind();
cb2.limit(7);
System.out.println(cb2);
// 0ab = 0ab + same number of "empty positions" until limit
// (don't know how to name "empty positions" correctly)
System.out.println(cb1.equals(cb2)); // TRUE
你的问题很相关。
如果您查看实现,您会发现没有完成与元素类型相关的检查:
public boolean equals(Object ob) {
if (this == ob)
return true;
if (!(ob instanceof CharBuffer))
return false;
CharBuffer that = (CharBuffer)ob;
if (this.remaining() != that.remaining())
return false;
return BufferMismatch.mismatch(this, this.position(),
that, that.position(),
this.remaining()) < 0;
}
关于类型的唯一检查是参数中的对象是 CharBuffer
.
的实例
我们可以注意到的一件有趣的事情是 CharBuffer
派生自 Buffer
但是 CharBuffer
覆盖 equals()
的方式只有 CharBuffer
的实例可能相等他们之间。
Buffer
诸如 ByteBuffer
或 IntBuffer
之类的实现在它们之间不可互操作。
按照实现来看,大概是这个意思。
请注意,其他 Buffer
实现在这一点上有相似之处:
They have the same element type
不,两个具有不同元素类型的 CharBuffer
实例的示例是不可能的。冒犯的评论并没有错,但是从 CharBuffer
的元素类型总是 char
的事实可以推断出来,它可能被视为多余的。
我只能推测,但这条评论可能是为了澄清 ByteBuffer
不能相等,即使它的内容可以被视为 char
(通过 getChar()
、putChar()
和 asCharBuffer()
方法)。
CharBuffer
的equals()
方法相当棘手。
从 position()
返回)包含到 limit()
不包含。 两个 CharBuffer(s) 中的容量和位置之前和限制之后的任何内容都没有通过 equals() 方法进行分析。
但是短语“相同的元素类型”和“...元素...逐点”打败我。
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.
我还缺少什么?什么是元素类型? CharBuffer里面不是一直都是char吗?
P.S。根据实现代码 (Java SE8) 实际上没有(元素)类型检查在 equals(obj) 中完成——只有标准检查 if (obj instanceof CharBuffer)
。所以 API 中的这个短语只是为了将来的一些实现或者我不知道是什么。或者 "same element type" 只是意味着 equals(arg) - arg 必须是 CharBuffer,这是微不足道的。
能否举例说明两个不同"element type"的CharBuffer对象?
根据定义,此类 CharBuffer 对象不相等。
CharBuffer cb1 = CharBuffer.allocate(10);
cb1.put('0');
cb1.put('a'); // element type - char ?
cb1.put('b');
cb1.rewind();
cb1.limit(7);
System.out.println(cb1);
CharBuffer cb2 = CharBuffer.allocate(11);
cb2.put("0ab"); // element type - String ?
cb2.rewind();
cb2.limit(7);
System.out.println(cb2);
// 0ab = 0ab + same number of "empty positions" until limit
// (don't know how to name "empty positions" correctly)
System.out.println(cb1.equals(cb2)); // TRUE
你的问题很相关。
如果您查看实现,您会发现没有完成与元素类型相关的检查:
public boolean equals(Object ob) {
if (this == ob)
return true;
if (!(ob instanceof CharBuffer))
return false;
CharBuffer that = (CharBuffer)ob;
if (this.remaining() != that.remaining())
return false;
return BufferMismatch.mismatch(this, this.position(),
that, that.position(),
this.remaining()) < 0;
}
关于类型的唯一检查是参数中的对象是 CharBuffer
.
的实例
我们可以注意到的一件有趣的事情是 CharBuffer
派生自 Buffer
但是 CharBuffer
覆盖 equals()
的方式只有 CharBuffer
的实例可能相等他们之间。
Buffer
诸如 ByteBuffer
或 IntBuffer
之类的实现在它们之间不可互操作。
按照实现来看,大概是这个意思。
请注意,其他 Buffer
实现在这一点上有相似之处:
They have the same element type
不,两个具有不同元素类型的 CharBuffer
实例的示例是不可能的。冒犯的评论并没有错,但是从 CharBuffer
的元素类型总是 char
的事实可以推断出来,它可能被视为多余的。
我只能推测,但这条评论可能是为了澄清 ByteBuffer
不能相等,即使它的内容可以被视为 char
(通过 getChar()
、putChar()
和 asCharBuffer()
方法)。