0

equals()方法CharBuffer相当棘手。

这里我知道它对以下块进行逐字符或逐元素???)比较:从(开始)位置(由返回position())包含到limit()排除。容量和位置之前和限制之后的任何内容都不会在 CharBuffer(s) 中通过 equals() 方法进行分析。

但是短语“相同元素类型”和“......元素......逐点”击败了我。

两个 char 缓冲区相等当且仅当,

它们具有相同的元素类型

它们具有相同数量的剩余元素,并且

剩余元素的两个序列,独立于它们的起始位置考虑,是逐点相等的。

我还缺少什么?什么是元素类型?CharBuffer 中不总是 char 吗?

PS根据实现代码(Java SE8)实际上没有(元素)类型检查在 equals(obj) 内完成 - 只有标准检查if (obj instanceof CharBuffer)。所以 API 中的这个短语只是为了一些未来的实现或者我不知道什么。或者也许“相同的元素类型”只是意味着等于(arg) - arg 必须是 CharBuffer,这是微不足道的。

您能否举一个具有不同“元素类型”的两个 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
4

2 回答 2

1

你的问题非常相关。
如果您查看实现,您会发现没有完成与元素类型相关的检查:

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(),其中只有实例 ofCharBuffer 可能在它们之间是相等的。
Buffer诸如ByteBufferorIntBuffer这样的实现在它们之间是不可互操作的。
根据实现,这可能意味着。
请注意,其他Buffer实现与这一点有相似之处:

它们具有相同的元素类型

于 2019-01-03T19:36:38.750 回答
1

不,CharBuffer不可能有两个具有不同元素类型的实例的示例。CharBuffer冒犯的注释没有错,但可以从元素类型always的事实推断char,它可能被视为多余的。

我只能推测,但这个评论可能是为了澄清 aByteBuffer不能相等,即使它的内容可以被视为char(通过getChar()putChar()asCharBuffer()方法)。

于 2019-01-03T20:03:29.830 回答