繁体   English   中英

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

[英]What's the difference between buffer(int) and buffer()?

我试图将数据包发送到客户端,我注意到即使我没有设置初始容量也没有错误。

// 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)将其发送到通道。 我做对了吗?

文档:

  • buffer()

    创建一个具有较小初始容量的新的大端Java堆缓冲区,该缓冲区按需无限扩展。

  • buffer(int initialCapacity)

    创建具有指定容量的新的大端Java堆缓冲区,该缓冲区可根据需要无限扩展。 新缓冲区的readerIndex和writerIndex为0。

因此, buffer(int)功能与buffer()相同,但是具有指定的起始容量。 如果您知道需要的容量比默认容量大,它将更好地执行,因为如果没有足够的容量,则不必继续扩展。 编辑 :同样,如@yelliver所述,您可以通过指定来节省内存,具体取决于您创建的缓冲区对象的数量(或取决于缓冲区的大小),它们的总和。

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

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

请参阅buffer()文档:

创建一个初始容量较小的新的大端Java堆缓冲区,该缓冲区可根据需要无限扩展。

buffer(int initialCapacity) doc:

创建一个具有指定容量的新的大端Java堆缓冲区,该缓冲区可根据需要无限扩展。

在一般的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. 缺点 :有时您从一开始就无法确切知道尺寸,否则尺寸的计算很复杂

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM