首先看下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
分享到:
相关推荐
主要解决从流中获取数据,缓存,拆解,可用于TCP粘包问题
仿安卓ByteBuffer 完美组包、拆包
【IT十八掌徐培成】Java基础第26天-05.ByteBuffer-mark-pos-limit-cap-flip.zip
NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811
ebson 是一个可扩展的 BSON 文档 Java 开发包。Maven: <groupId>com.github.kohanyirobert</groupId> <artifactId>ebson <version>... 示例代码:// create documents to serialize BsonDocument ...
protobuf.js 库 包含protobuf.js long.js bypebuffer.js
Azzet 是一个简单的 Java 类库,用于从不同的源中加载资源。示例代码:BufferedImage img = Assets.load("http://www.google.com/logos/classicplus.png"); // loaded from website Font fnt = Assets....
一. NIO 基础 1. 三大组件 2. ByteBuffer 3. 文件编程 4. 网络编程 5. NIO vs BIO 二. Netty 入门 1. 概述 2. Hello World 3. 组件 4. 双向通信 三. Netty 进阶 1. 粘包与半包 2. 协议设计与解析 3. 聊天室案例 四. ...
系统调用与库函数对于不同buffer size写文件效率对比
import java.awt.*;... //channel.write(ByteBuffer.wrap(new String("向服务端发送了一条信息").getBytes())); //在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。 ...
易语言汇编版ByteBuffer源码。主要用于各种网络协议的组包 具体用法可以点上面的网址 功能和jAVA的一样。@10371178。Tags:易语言汇编版ByteBuffer源码。
NULL 博文链接:https://chinaestone.iteye.com/blog/468138
开发环境:Jbuilder\MyEclipse
java api之ByteBuffer基础、应用场景、实战讲解 文档中有丰富的例子代码实现
如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理。 由于对于本程序 116个字节以上的行才有意义,所以 在next实现方法中,有对 116 长度的判断,否则返回 null 修正了之前版本中的问题: 修正...
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
[CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBuffer ) 用法 #分配 ByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( void )put:( Byte )b; ...
ByteBuffer jpegBuffer = ByteBuffer.wrap(rgbBuffer); bmp.copyPixelsFromBuffer(jpegBuffer); canvas.drawBitmap(bmp, null, rect, null); // draw camera bitmap native接口如下 package lzt.drv; public class ...
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); vbb.order(ByteOrder.nativeOrder());//设置字节顺序 mVertexBuffer = vbb.asIntBuffer();//转换为int型缓冲 mVertexBuffer.put(vertices)...