flip和clear仅重置position、limit、mark三个指针而不修改底层数组:flip设limit=position、position=0、mark=-1,为读准备;clear设limit=capacity、position=0、mark=-1,为写重置。

flip 和 clear 不改变底层字节数组(backing array)或堆外内存地址,只调整 Buffer 内部的三个关键指针:position、limit、mark。
flip:为读取做准备(写→读切换)
调用前通常处于写模式(put 操作后),position 指向下一个可写位置,limit 等于容量(capacity)。flip 的本质是:
- 将当前 position 值赋给 limit,即 limit = position
- 将 position 重置为 0,即 position = 0
- mark 被设为 -1(无效)
字节码层面无内存拷贝,仅三条字段赋值指令(如 putfield)。指针逻辑变为:[0, limit) 可读,position 是下一个待读字节索引。
clear:为下一轮写入重置(读→写切换)
调用前通常处于读模式(get 操作后),position 指向下一个待读位置,limit 是本次读取范围上限。clear 的本质是:
- 将 capacity 赋给 limit,即 limit = capacity
- 将 position 重置为 0,即 position = 0
- mark 被设为 -1
它不擦除数据,只是“假装没读过/没写过”。底层字节数组内容完全不变,仅指针回归初始写状态。
底层字段变动对比(以 ByteBuffer 为例)
Buffer 抽象类中维护:
- int position —— 当前操作索引
- int limit —— 有效数据边界(读/写上限)
- int mark —— 标记位置(reset 时回退目标)
- int capacity —— 容量(只读,创建后固定)
flip 与 clear 均不修改 capacity,也不触碰底层数组引用(如 byte[] hb 或 long address),纯属元数据重置。
注意:compact 是唯一真正移动数据的操作
flip/clear 都不搬移字节;只有 compact() 在读模式下会把未读数据移到起始位置,并更新 position 和 limit —— 此时才发生实际内存复制(System.arraycopy 或 Unsafe.copyMemory)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











