bytebuffer.allocate() 创建堆内缓冲区,底层为 heapbytebuffer,isdirect() 返回 false,支持 array() 获取字节数组,适合短生命周期中小量数据,但不支持零拷贝。

Java NIO 中用 ByteBuffer.allocate() 是最常用、最直接的堆内缓冲区创建方式,适合绝大多数需要临时存取字节数据的场景。
allocate 创建的是堆内缓冲区(Heap Buffer)
调用 ByteBuffer.allocate(int capacity) 会分配一块位于 JVM 堆内存中的字节数组,由 GC 统一管理:
- 底层实际返回
HeapByteBuffer实例 -
buffer.isDirect()返回 false - 支持
buffer.array()获取底层字节数组引用(可直接操作) - 创建快、访问快,适合短生命周期、中小量数据
基本用法与关键步骤
分配后需配合 position/limit/capacity 三要素完成读写,典型流程如下:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 分配:
ByteBuffer buf = ByteBuffer.allocate(1024); - 写入:
buf.put((byte) 0x41).put("Hi".getBytes());(自动推进 position) - 翻转:
buf.flip();(将 limit 设为当前 position,position 归零,准备读) - 读取:
byte b = buf.get();或buf.get(new byte[10]); - 清空或重用:
buf.clear();(仅重置指针,不擦除数据)或buf.compact();(保留未读数据并前移)
注意容量不可变,且不能用于零拷贝 I/O
allocate() 分配的缓冲区无法绕过 JVM 堆参与真正的零拷贝传输:
- 向
SocketChannel或FileChannel写数据时,JVM 可能内部复制一份到临时 Direct Buffer 才真正发起系统调用 - 因此高频网络收发、大块文件传输等场景,
allocate()不是最佳选择 - 若需零拷贝,应改用
allocateDirect(),但要注意其分配开销和回收机制
简单验证示例
运行这段代码可快速确认是否为堆内缓冲区:
ByteBuffer heapBuf = ByteBuffer.allocate(64);
System.out.println(heapBuf.isDirect()); // 输出 false
System.out.println(heapBuf.array() != null); // 输出 true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










