`
polim
  • 浏览: 104743 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 源码阅读系列(一) ByteBuffer.equals

阅读更多
首先看下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


分享到:
评论
2 楼 ping2010 2013-03-23  
if ((v1 != v1) && (v2 != v2)) // For float and double
    continue;
这里应该不会走到continue吧,只是为了向后兼容准备吧?
1 楼 butnet 2012-10-19  
请问这个
if ((v1 != v1) && (v2 != v2)) // For float and double
    continue;
真的能走到吗?
在什么情况下能到?

因为我觉得byte类型是没有NaN的,
它之前是NaN,
但通过get方法取出来的不会是NaN呀.
所以我觉得这个if不可能走得到.

如果真的走到?
请举例,
最好能给出具体代码.
谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics