为了账号安全,请及时绑定邮箱和手机立即绑定

buffer(int) 和 buffer() 有什么区别?

buffer(int) 和 buffer() 有什么区别?

繁华开满天机 2021-08-25 09:56:59
我正在尝试向客户端发送数据包,但我注意到即使我没有设置初始容量也没有错误。// data is another ByteBuf object// With capacityByteBuf d = Unpooled.buffer(2 + data.array().length);d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());// Without capacityByteBuf d = Unpooled.buffer();d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());这两者有什么区别吗?他们两个似乎都工作得很好。我还想知道我是否做得对,我正在创建一个新的ByteBufwith Unpooled.buffer,在其中写入我的数据并channel.write(ByteBuf)在需要向客户端发送某些内容时将其发送到通道。我做得对吗?
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

文档:

  • buffer()

    创建一个新的 big-endian Java 堆缓冲区,其初始容量相当小,可按需无限扩展其容量。

  • buffer(int initialCapacity)

    创建一个新的具有指定容量的 big-endian Java 堆缓冲区,它可以按需无限扩展其容量。新缓冲区的 readerIndex 和 writerIndex 为 0。

所以,buffer(int)做同样的事情,buffer()但具有指定的起始容量。如果您知道需要比默认容量更大的容量,它的性能会更好,因为如果容量不足,它就不必继续扩展。编辑:另外,正如@yelliver 所说,您可以通过指定来节省内存,这可能取决于您创建的缓冲区对象的数量(或取决于缓冲区的大小)。

看起来buffer(int)还设置了一些buffer()可能不会的索引。


查看完整回答
反对 回复 2021-08-25
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

不同之处在于它们具有不同的初始容量。

请参阅buffer()文档:

创建一个新的 big-endian Java 堆缓冲区,初始容量相当小,可按需无限扩展其容量。

buffer(int initialCapacity)文档:

创建一个具有指定容量的新的 big-endian Java 堆缓冲区,它可以按需无限扩展其容量。


查看完整回答
反对 回复 2021-08-25
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

在一般Java中,很多情况下你可以通过容量或不通过,两者都可以。如果不传容量,则默认容量,容量满时自动扩容。例如:


String[] arr = list.toArray(new String[list.size()]);

//OR

String[] arr = list.toArray(new String[0]);


List<String> list = new ArrayList<>(10);

//OR

List<String> list = new ArrayList<>();

如果让默认容量:

  1. 优点:无需关心容量(显然)

  2. 缺点:如果您打算使用小于默认容量的小尺寸,则会浪费内存。

如果你通过了你的意图能力:

  1. 优点:节省内存,您可以准确分配所需的内存。

  2. 缺点:有时您无法从一开始就知道确切的尺寸,或者尺寸的计算很复杂


查看完整回答
反对 回复 2021-08-25
  • 3 回答
  • 0 关注
  • 245 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信