首先看下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
分享到:
相关推荐
1. **分配缓冲区**:可以通过`ByteBuffer.allocate(int capacity)`来创建一个新的ByteBuffer,其中capacity参数指定缓冲区的大小。 2. **直接缓冲区**:对于性能敏感的应用,可以使用`ByteBuffer.allocateDirect...
标题"ByteBuffer.zip"可能包含的是一个针对Android平台实现的ByteBuffer类的源代码包,包括了头文件ByteBuffer.h和实现文件ByteBuffer.m。这两个文件通常是C++或Objective-C的代码,因为Android原生开发通常使用C/...
2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...
从网络或者存储中获取到protobuf编码的二进制数据后,可以创建一个`ByteBuffer`实例,然后调用protobuf编译器生成的类的解析方法,传入`ByteBuffer`实例进行解码。`ByteBuffer`会根据protobuf编码规则正确地读取和...
3. **bytebuffer.js**:ByteBuffer是一个二进制缓冲区的实现,类似于Java的ByteBuffer类。在protobuf中,数据是以二进制形式存储和传输的,bytebuffer.js提供了读写二进制数据的能力,这对于处理protobuf序列化的...
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(Bitmap)位图文件是一项常见的图像处理任务。BMP是一种无损的图像文件格式,广泛应用于Windows操作系统和许多其他软件中。它以未经压缩的二进制形式存储图像数据,因此解析BMP文件可以...
主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题
在Java中实现WebSocket,通常会用到JSR 356(Java API for WebSocket)标准,该标准是Java EE 7及更高版本的一部分。下面将详细介绍Java实现WebSocket的相关知识点。 一、WebSocket基础 WebSocket协议定义了一种在...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
Apache Mina是一个高性能的网络应用框架,主要用于简化网络...通过阅读《深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别》的相关资料,可以更深入地理解这两个类的具体实现和应用场景。
ByteBuffer buffer = ByteBuffer.allocate(1024); // 将数据从FileChannel读入buffer fileChannel.read(buffer); // 切换buffer状态以便读取 buffer.flip(); // 从buffer中读取数据 while (buffer.hasRemaining()...
创建`ByteBuffer`时,需要指定容量,例如通过`ByteBuffer.allocate(capacity)`。 2. **Position**:位置表示当前读写的位置,初始值为0。每次读写操作后,位置会递增。当向`Buffer`中添加数据或从`Buffer`中取出...
ByteBuffer buffer = ByteBuffer.allocateDirect(MyStruct.SIZE); // SIZE应为结构体的字节大小 buffer.order(ByteOrder.BIG_ENDIAN); // 与发送端保持一致的字节序 inputStream.read(buffer.array()); MyStruct ...
Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套全新的 I/O 处理方式,相比于传统的 I/O API,新版本提供了更高效、更灵活的解决方案。本书《Java™ NIO》由 Ron ...
byte[] bytes = ByteBuffer.allocate(4).putInt(value).array(); for (byte t : bytes) { System.out.format("0x%x ", t); } ``` 这将输出整数8对应的字节表示,通常在处理二进制数据或网络通信时会用到。 ...
`FastCopyFile.java`可能会展示如何创建FileChannel,从源文件读取数据到一个ByteBuffer,然后将该缓冲区的数据写入目标文件的FileChannel,以此实现高效的文件复制。 接下来,我们来看`UseFloatBuffer.java`。...