首先看下ByteBuffer里面的equals方式实现源码,如下:
public boolean equals(Object ob) {
if (!(ob instanceof ByteBuffer))
return false;
ByteBuffer that = (ByteBuffer)ob;
if (this.remaining() != that.remaining())
return false;
int p = this.position();
for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--) {
byte v1 = this.get(i);
byte v2 = that.get(j);
if (v1 != v2) {
if ((v1 != v1) && (v2 != v2)) // For float and double
continue;
return false;
}
}
return true;
}
equals源码的逻辑很简单
1、首先判断传入的对象是否为ByteBuffer类型
2、判断两个ByteBuffer长度是否相同
3、循环迭代判断ByteBuffer中byte数组内容是否相同
问题来了,if ((v1 != v1) && (v2 != v2)) 为什么要进行这个判断呢?v1 == v1,v2==v2这两个应该都是true的,为什么这个地方还要进行一次多余的判断呢,为什么?
现在的问题简单了,什么情况下会出现 v1 != v1 的情况?
这个问题让你产生困惑,一个数字总是等于它自己的,对吗?
在java 中浮点算术保留了一个特殊的值用来表示一个不是数字的数量,这个值就是NaN, ex:0.0/0.0
因此如果数值初始化为NaN,那 v1 != v1 情况就出现了。
ex:
double ii = Double.NaN;
double jj = Double.NaN;
double iii = 0.0/0.0;
System.out.println(ii == jj);
System.out.println(iii == jj);
System.out.println(iii == ii);
float a = Float.NaN;
float b = Float.NaN;
System.out.println(a == b);
System.out.println(a != b);
输出结果为:
false
false
false
false
true
public boolean equals(Object ob) {
if (!(ob instanceof ByteBuffer))
return false;
ByteBuffer that = (ByteBuffer)ob;
if (this.remaining() != that.remaining())
return false;
int p = this.position();
for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--) {
byte v1 = this.get(i);
byte v2 = that.get(j);
if (v1 != v2) {
if ((v1 != v1) && (v2 != v2)) // For float and double
continue;
return false;
}
}
return true;
}
equals源码的逻辑很简单
1、首先判断传入的对象是否为ByteBuffer类型
2、判断两个ByteBuffer长度是否相同
3、循环迭代判断ByteBuffer中byte数组内容是否相同
问题来了,if ((v1 != v1) && (v2 != v2)) 为什么要进行这个判断呢?v1 == v1,v2==v2这两个应该都是true的,为什么这个地方还要进行一次多余的判断呢,为什么?
现在的问题简单了,什么情况下会出现 v1 != v1 的情况?
这个问题让你产生困惑,一个数字总是等于它自己的,对吗?
在java 中浮点算术保留了一个特殊的值用来表示一个不是数字的数量,这个值就是NaN, ex:0.0/0.0
因此如果数值初始化为NaN,那 v1 != v1 情况就出现了。
ex:
double ii = Double.NaN;
double jj = Double.NaN;
double iii = 0.0/0.0;
System.out.println(ii == jj);
System.out.println(iii == jj);
System.out.println(iii == ii);
float a = Float.NaN;
float b = Float.NaN;
System.out.println(a == b);
System.out.println(a != b);
输出结果为:
false
false
false
false
true