ByteBuffer实现解析 Direct vs Heapped性能比较

本文探讨了Java中的ByteBuffer,特别是DirectByteBuffer和HeapByteBuffer的实现和性能差异。DirectByteBuffer通过JNI直接操作堆外内存,减少了内存复制,提高效率,适用于大量二进制数据处理。而HeapByteBuffer则在Java堆上分配内存,适合小规模数据操作。通过视图操作和批量接口,DirectByteBuffer在某些场景下能提供更高的性能。
摘要由CSDN通过智能技术生成

ByteBuffer封装了一个实现类,可以方便的把java基础数据类型(short, int, long, float, double)转换成byte数组形式,反之亦然;做二进制数据的生成和读取时,会特别有用。

实现上,整型数可以通过移位获取各个字节,然后写到byte数组中即可;而浮点型没办法直接获得字节数据,只能通过Float.floatToIntBits(详细参见java api)类似的方法,转换成IEEE 754的二进制表达,变成一个int型,然后再写入byte数组中。读取与此类似。ByteBuffer有两个继承类,HeappedByteBuffer和DirectByteBuffer,api上针对这两种有很详细的描述,我这里说一下实现。

java堆的ByteBuffer

HeappedByteBuffer是通过ByteBuffer.allocate获得的,其内部的byte数组,通过new byte[]获得,所以数据都在java的堆(Heap)中。之后的各种get/put方法都是在操作这个堆上的byte数组,贴两段示例代码:

 ByteBuffer中的getInt方法, 主要处理位置相关,实际的工作在Bits中实现。

 public int ByteBuffer::getInt() {
    return Bits.getInt(this, ix(nextGetIndex(4)), bigEndian);
    }

Bits中的getInt实现,先拿到4个比特,然后makeInt通过位移构建一个int。

static int Bits::getIntL(ByteBuffer bb, int bi) {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值