Java's ByteBuffer内部是用于实现Comparable< ByteBuffer> ...的方法compareTo ...
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();
}
if ((v1 != v1) && (v2 != v2)) // For float and double
有什么意义?
如果我写这种代码,我会被警告要比较相同的表达式。
答案 0 :(得分:2)
在那个特定的代码中,它没有意义。然而,这是花车和双打的流行成语。两者都可以是“NaN”,这意味着它们不代表有效的,可比较的数字。 NaN在技术上不等于任何东西,甚至本身,所以对于float或double,代码会检查两者是否都是NaN,在这种情况下足以称它们相等。
答案 1 :(得分:2)
我似乎是从一个公共源代码模板生成的Buffer类,这个特定的行只对float和double版本有意义,以检测两个数字都是NAN的特殊情况。
答案 2 :(得分:1)
Double.NaN == Double.NaN
和Float.NaN == Float.NaN
提供false
。
另见JLS 4.2.3的结尾:
如果任一操作数为NaN,则等于运算符==返回false,如果任一操作数为NaN(第15.21.1节),则不等式运算符!=返回true。
答案 3 :(得分:0)
正如所有其他的引用者已经指出的那样,检查Float.NaN
和Double.NaN
。他们应该使用Float.isNan
和Double.isNaN
。这会使代码更具可读性。长话短说:不要模仿。