Java';s ByteBuffer compareTo:将字节与自身进行比较;对于浮点数和双精度“;?

Java';s ByteBuffer compareTo:将字节与自身进行比较;对于浮点数和双精度“;?,java,Java,内部是实现可比性的方法compareTo public int compareTo(ByteBuffer that){ int n=this.position()+Math.min(this.remaining(),that.remaining()); 对于(inti=this.position(),j=that.position();i

内部是实现可比性的方法compareTo

public int compareTo(ByteBuffer that){
int n=this.position()+Math.min(this.remaining(),that.remaining());
对于(inti=this.position(),j=that.position();i
如果((v1!=v1)&(v2!=v2))//对于浮点和双精度,那么
有什么意义

如果我写这种代码,我会被警告不要比较相同的表达式。

并给出
false

另见下文末尾:

如果任一操作数为NaN,则相等运算符==返回false,而不等运算符!=如果任一操作数为NaN(§15.21.1),则返回true


在特定的代码中,它没有意义。然而,这是一个流行的浮点数和双数的成语。两者都可以是“NaN”,这意味着它们不代表有效的可比数字。NaN在技术上不等于任何东西,甚至它本身,因此对于浮点或双精度,代码将检查两者是否都是NaN,在本例中,这足以将它们称为相等。

我似乎缓冲区类是从公共源代码模板生成的,这一特定行仅对浮点和双精度版本有意义,以检测两个数字都是NaN的特殊情况。

正如所有其他Anwser已经指出的,它检查
float.NaN
double.NaN
。他们应该使用
Float.isNan
Double.isNan
。这将使代码更具可读性。长话短说:不要模仿。

我明白了;每个基元类型都有一个缓冲区,所以这就是如何为FloatBuffer和DoubleBuffer实现compareTo。代码可能是机械生成的。作为引用:public abstract FloatBuffer asFloatBuffer();
public int compareTo(ByteBuffer that) {
    int n = this.position() + Math.min(this.remaining(), that.remaining());
    for (int i = this.position(), j = that.position(); i < n; i++, j++) {
        byte v1 = this.get(i);
        byte v2 = that.get(j);
        if (v1 == v2)
            continue;
        if ((v1 != v1) && (v2 != v2)) // For float and double
            continue;
        if (v1 < v2)
            return -1;
        return +1;
    }
    return this.remaining() - that.remaining();
}