buffer(int) 和 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());

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


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


繁华开满天机
浏览 246回答 3
3回答

繁花如伊

从文档:buffer()创建一个新的 big-endian Java 堆缓冲区,其初始容量相当小,可按需无限扩展其容量。buffer(int initialCapacity)创建一个新的具有指定容量的 big-endian Java 堆缓冲区,它可以按需无限扩展其容量。新缓冲区的 readerIndex 和 writerIndex 为 0。所以,buffer(int)做同样的事情,buffer()但具有指定的起始容量。如果您知道需要比默认容量更大的容量,它的性能会更好,因为如果容量不足,它就不必继续扩展。编辑:另外,正如@yelliver 所说,您可以通过指定来节省内存,这可能取决于您创建的缓冲区对象的数量(或取决于缓冲区的大小)。看起来buffer(int)还设置了一些buffer()可能不会的索引。

元芳怎么了

不同之处在于它们具有不同的初始容量。请参阅buffer()文档:创建一个新的 big-endian Java 堆缓冲区,初始容量相当小,可按需无限扩展其容量。和buffer(int initialCapacity)文档:创建一个具有指定容量的新的 big-endian Java 堆缓冲区,它可以按需无限扩展其容量。

牧羊人nacy

在一般Java中,很多情况下你可以通过容量或不通过,两者都可以。如果不传容量,则默认容量,容量满时自动扩容。例如:String[] arr = list.toArray(new String[list.size()]);//ORString[] arr = list.toArray(new String[0]);List<String> list = new ArrayList<>(10);//ORList<String> list = new ArrayList<>();如果让默认容量:优点:无需关心容量(显然)缺点:如果您打算使用小于默认容量的小尺寸,则会浪费内存。如果你通过了你的意图能力:优点:节省内存,您可以准确分配所需的内存。缺点:有时您无法从一开始就知道确切的尺寸,或者尺寸的计算很复杂
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java