equals()
的{{1}}方法非常棘手。
从here中我知道,它使 char-by-char ( 或element-by-element ???) 比较以下块:从(起始)位置(由CharBuffer
返回)包括(包括)。完全没有通过equals()方法在两个CharBuffer中分析容量和位置前后的任何内容。
但是短语“ 相同元素类型 ”和“ ... 元素 ...点对点”击败了我。
两个char缓冲区等于if, and only if,
它们具有相同的元素类型,
它们具有相同数量的剩余元素,并且
剩余的两个元素序列,独立于 它们的起始位置逐点相等。
我还想念什么?什么是元素类型?在CharBuffer中不是总是char吗?
P.S。根据实现代码(Java SE8),实际上在equals(obj)内不执行任何(元素)类型检查-仅执行标准检查position()
。因此,API中的该短语仅用于将来的实现或不知道什么。也许“相同的元素类型”仅意味着equals(arg)-arg必须是CharBuffer,这很简单。
能否举两个具有不同“元素类型”的CharBuffer对象的示例?
此类CharBuffer对象在定义上不相等。
limit()
答案 0 :(得分: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()
唯一的实例可能相等的方式覆盖了CharBuffer
他们之间。
Buffer
实现,例如ByteBuffer
或IntBuffer
在它们之间是不可互斥的。
根据实现,这可能意味着。
请注意,其他Buffer
实现在这一点上具有相似之处:
它们具有相同的元素类型
答案 1 :(得分:1)
否,不可能是两个具有不同元素类型的CharBuffer
实例的示例。令人反感的评论是没有错的,但是可以从CharBuffer
的元素类型始终为char
的事实中推断出来,并且可能被认为是多余的。
我只能推测,但是此注释可能是为了澄清ByteBuffer
不能相等,即使可以将其内容视为char
(通过getChar()
,{ {1}}和putChar()
方法)。