Java';s ByteBuffer compareTo:将字节与自身进行比较;对于浮点数和双精度“;?
内部是实现可比性的方法compareToJava';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
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();
}