首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >buffer(int)和buffer()有什么区别?

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

Stack Overflow用户
提问于 2018-09-01 01:29:12
回答 3查看 97关注 0票数 0

我正在尝试向客户端发送一个数据包,我注意到即使我没有设置初始容量,也没有错误。

代码语言:javascript
复制
// data is another ByteBuf object
// With capacity
ByteBuf d = Unpooled.buffer(2 + data.array().length);
d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());
// Without capacity
ByteBuf d = Unpooled.buffer();
d.writeByte(identifiers[0]).writeByte(identifiers[1]).writeBytes(data.array());

这两者之间有什么区别吗?它们似乎都工作得很好。

我还想知道我这样做是否正确,我正在使用Unpooled.buffer创建一个新的ByteBuf,当我需要向客户端发送一些东西时,将数据写入其中,并使用channel.write(ByteBuf)将其发送到通道。我做得对吗?

EN

回答 3

Stack Overflow用户

发布于 2018-09-01 01:36:34

docs:

  • buffer()创建了一个新的大端Java堆缓冲区,初始容量相当小,可以按需无限扩展其容量。

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

因此,buffer(int)buffer()执行相同的操作,但具有指定的起始容量。如果你知道你需要一个比默认容量更大的容量,它会表现得更好,因为如果没有足够的容量,它就不需要一直扩展。编辑:同样,正如@yelliver所说,你可以通过指定来节省内存,这可能会根据你创建的缓冲区对象的数量(或者取决于缓冲区的大小)而增加。

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

票数 4
EN

Stack Overflow用户

发布于 2018-09-01 01:32:57

不同的是它们具有不同的初始能力。

请参阅buffer()文档:

使用合理较小的初始容量创建了一个新的大端Java堆缓冲区,它可以按需无限扩展其容量。

buffer(int initialCapacity)文档:

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

票数 1
EN

Stack Overflow用户

发布于 2018-09-01 01:38:16

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

代码语言:javascript
复制
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. Pros:不需要关心容量(显然)
  2. Cons:如果您打算使用小于默认容量的小容量,则会浪费内存。

如果你通过了你的意向能力,:

节省内存,你确切地分配你want.

  • Cons:的内存有时你不能从一开始就知道确切的大小,或者大小的计算很复杂
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52120271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档