分配后清除()bytebuffer是一种好习惯吗?

时间:2016-03-04 15:15:51

标签: java

我继承了一些使用本地ByteBuffer

将消息写入套接字的java代码
public void sendMessage(){
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
    byteBuffer.clear();
    byteBuffer.putInt((int) 128);
}

似乎clear()来电是不必要的。不会分配保证返回释放的内存块吗?

2 个答案:

答案 0 :(得分:8)

完全没必要在clear()之后致电allocateDirect

allocateDirect的作用是:

  

新缓冲区的位置将为零,其限制将是其容量,其标记将是未定义的,并且其每个元素将初始化为零。

clear的作用是:

  

位置设置为零,限制设置为容量,标记被丢弃   [..]
  这种方法实际上并没有删除缓冲区中的数据,但是它被命名为好像是因为它最常用于可能出现这种情况的情况。

换句话说,分配后ByteBuffer的状态与clear()之后的状态相同(忽略clear()未将元素重置为零)。

答案 1 :(得分:2)

如果尚未使用缓冲区,则无需清除缓冲区(并使标记混乱)。

请注意,即使在调用clear之后,mem中的任何内容仍然存在,因为它只是重置限制并抛出当前标记。

因此,结束数据区域结果与新分配相同。

然而,通常会清除您从未知代码中收到的缓冲区引用,以填充如下:

ByteBuffer FillBytes(ByteBuffer buf) 
 { 
    buf.clear();
    //--- 
 }

因为即使您可能会认为传递给您的缓冲区已准备好填充,由于方法合同的性质,您不能假设初始开发人员在您尝试填充它之前重置了它例如(可能已用于某些东西,因此需要重置)。