`
polim
  • 浏览: 105890 次
  • 性别: 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不可能走得到.

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

相关推荐

    Android中的ByteBuffer解析

    1. **分配缓冲区**:可以通过`ByteBuffer.allocate(int capacity)`来创建一个新的ByteBuffer,其中capacity参数指定缓冲区的大小。 2. **直接缓冲区**:对于性能敏感的应用,可以使用`ByteBuffer.allocateDirect...

    ByteBuffer.zip

    标题"ByteBuffer.zip"可能包含的是一个针对Android平台实现的ByteBuffer类的源代码包,包括了头文件ByteBuffer.h和实现文件ByteBuffer.m。这两个文件通常是C++或Objective-C的代码,因为Android原生开发通常使用C/...

    Java NIO学习笔记——ByteBuffer用法

    2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    protobuf+long+bytebuffer

    从网络或者存储中获取到protobuf编码的二进制数据后,可以创建一个`ByteBuffer`实例,然后调用protobuf编译器生成的类的解析方法,传入`ByteBuffer`实例进行解码。`ByteBuffer`会根据protobuf编码规则正确地读取和...

    protobuf.js

    3. **bytebuffer.js**:ByteBuffer是一个二进制缓冲区的实现,类似于Java的ByteBuffer类。在protobuf中,数据是以二进制形式存储和传输的,bytebuffer.js提供了读写二进制数据的能力,这对于处理protobuf序列化的...

    java读取纯真IP数据库QQwry.dat的源代码--获取ip所在地区

    import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class QQwryReader { private RandomAccessFile file; private FileChannel channel; public QQwryReader(String filePath) throws...

    java关于BMP位图文件解析的分析与实现[源码][附图]

    在Java编程语言中,解析BMP(Bitmap)位图文件是一项常见的图像处理任务。BMP是一种无损的图像文件格式,广泛应用于Windows操作系统和许多其他软件中。它以未经压缩的二进制形式存储图像数据,因此解析BMP文件可以...

    ByteBuffer.cs

    主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题

    Java WebSocket编程,java实现websocket,Java源码.zip

    在Java中实现WebSocket,通常会用到JSR 356(Java API for WebSocket)标准,该标准是Java EE 7及更高版本的一部分。下面将详细介绍Java实现WebSocket的相关知识点。 一、WebSocket基础 WebSocket协议定义了一种在...

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    Apache Mina是一个高性能的网络应用框架,主要用于简化网络...通过阅读《深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别》的相关资料,可以更深入地理解这两个类的具体实现和应用场景。

    java NIO详细教程

    ByteBuffer buffer = ByteBuffer.allocate(1024); // 将数据从FileChannel读入buffer fileChannel.read(buffer); // 切换buffer状态以便读取 buffer.flip(); // 从buffer中读取数据 while (buffer.hasRemaining()...

    【IT十八掌徐培成】Java基础第26天-05.ByteBuffer-mark-pos-limit-cap-flip.zip

    创建`ByteBuffer`时,需要指定容量,例如通过`ByteBuffer.allocate(capacity)`。 2. **Position**:位置表示当前读写的位置,初始值为0。每次读写操作后,位置会递增。当向`Buffer`中添加数据或从`Buffer`中取出...

    Netty-4.1.97.Final源码

    Netty-4.1.97.Final源码提供了对Netty内部机制的深度洞察,对于Java程序员尤其是希望提升网络编程能力或进行定制化开发的人来说,是一份极其宝贵的资料。 首先,让我们从整体上了解Netty的架构设计。Netty采用了...

    Android/Java基于Socket接收结构体数据

    ByteBuffer buffer = ByteBuffer.allocateDirect(MyStruct.SIZE); // SIZE应为结构体的字节大小 buffer.order(ByteOrder.BIG_ENDIAN); // 与发送端保持一致的字节序 inputStream.read(buffer.array()); MyStruct ...

    Java.NIO资源下载资源下载

    Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套全新的 I/O 处理方式,相比于传统的 I/O API,新版本提供了更高效、更灵活的解决方案。本书《Java™ NIO》由 Ron ...

    Java数组操作方法总结2.pdf

    byte[] bytes = ByteBuffer.allocate(4).putInt(value).array(); for (byte t : bytes) { System.out.format("0x%x ", t); } ``` 这将输出整数8对应的字节表示,通常在处理二进制数据或网络通信时会用到。 ...

Global site tag (gtag.js) - Google Analytics