我正在尝试向客户端发送一个数据包,我注意到即使我没有设置初始容量,也没有错误。
// 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)将其发送到通道。我做得对吗?
发布于 2018-09-01 01:36:34
buffer()创建了一个新的大端Java堆缓冲区,初始容量相当小,可以按需无限扩展其容量。buffer(int initialCapacity)创建了一个具有指定容量的新的big-endian Java堆缓冲区,它可以按需无限扩展其容量。新缓冲区的readerIndex和writerIndex为0。因此,buffer(int)与buffer()执行相同的操作,但具有指定的起始容量。如果你知道你需要一个比默认容量更大的容量,它会表现得更好,因为如果没有足够的容量,它就不需要一直扩展。编辑:同样,正如@yelliver所说,你可以通过指定来节省内存,这可能会根据你创建的缓冲区对象的数量(或者取决于缓冲区的大小)而增加。
看起来buffer(int)还设置了一些buffer()可能不会设置的索引。
发布于 2018-09-01 01:32:57
不同的是它们具有不同的初始能力。
请参阅buffer()文档:
使用合理较小的初始容量创建了一个新的大端Java堆缓冲区,它可以按需无限扩展其容量。
和buffer(int initialCapacity)文档:
使用指定的容量创建了一个新的big-endian Java堆缓冲区,该缓冲区可以按需无限扩展其容量。
发布于 2018-09-01 01:38:16
在一般的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<>();如果您允许默认容量:,则为
如果你通过了你的意向能力,:
节省内存,你确切地分配你want.
https://stackoverflow.com/questions/52120271
复制相似问题