我继承了一些使用本地ByteBuffer
:
public void sendMessage(){
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
byteBuffer.clear();
byteBuffer.putInt((int) 128);
}
似乎clear()
来电是不必要的。不会分配保证返回释放的内存块吗?
答案 0 :(得分:8)
完全没必要在clear()
之后致电allocateDirect
。
allocateDirect
的作用是:
新缓冲区的位置将为零,其限制将是其容量,其标记将是未定义的,并且其每个元素将初始化为零。
clear
的作用是:
位置设置为零,限制设置为容量,标记被丢弃 [..]
这种方法实际上并没有删除缓冲区中的数据,但是它被命名为好像是因为它最常用于可能出现这种情况的情况。
换句话说,分配后ByteBuffer
的状态与clear()
之后的状态相同(忽略clear()
未将元素重置为零)。
答案 1 :(得分:2)
如果尚未使用缓冲区,则无需清除缓冲区(并使标记混乱)。
请注意,即使在调用clear之后,mem中的任何内容仍然存在,因为它只是重置限制并抛出当前标记。
因此,结束数据区域结果与新分配相同。
然而,通常会清除您从未知代码中收到的缓冲区引用,以填充如下:
ByteBuffer FillBytes(ByteBuffer buf)
{
buf.clear();
//---
}
因为即使您可能会认为传递给您的缓冲区已准备好填充,由于方法合同的性质,您不能假设初始开发人员在您尝试填充它之前重置了它例如(可能已用于某些东西,因此需要重置)。