Java 什么';缓冲区(int)和缓冲区()之间的区别是什么?

Java 什么';缓冲区(int)和缓冲区()之间的区别是什么?,java,netty,Java,Netty,我试图向客户端发送一个数据包,我注意到即使我没有设置初始容量,也没有错误 // 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

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

// 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());
这两者有什么区别吗?他们俩似乎都工作得很好


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

区别在于它们的初始容量不同

// 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());
见文件:

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

和文件:

创建具有指定容量的新big-endian Java堆缓冲区, 可根据需要无限扩展其容量


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

// 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());
见文件:

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

和文件:

创建具有指定容量的新big-endian Java堆缓冲区, 可根据需要无限扩展其容量

  • buffer()
    创建一个新的big-endian Java堆缓冲区,初始容量相当小,可根据需要无限扩展其容量

  • 缓冲区(int initialCapacity)
    创建具有指定容量的新big-endian Java堆缓冲区,该缓冲区可根据需要无限扩展其容量。新缓冲区的readerIndex和writerIndex为0

因此,
buffer(int)
执行与
buffer()
相同的操作,但具有指定的启动容量。如果您知道需要比默认值更大的容量,它的性能会更好,因为如果没有足够的容量,它就不必继续扩展编辑:此外,正如@yelliver所述,您可以通过指定来节省内存,这可能取决于您创建的缓冲区对象的数量(或缓冲区的大小)

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

  • buffer()
    创建一个新的big-endian Java堆缓冲区,初始容量相当小,可根据需要无限扩展其容量

  • 缓冲区(int initialCapacity)
    创建具有指定容量的新big-endian Java堆缓冲区,该缓冲区可根据需要无限扩展其容量。新缓冲区的readerIndex和writerIndex为0

因此,
buffer(int)
执行与
buffer()
相同的操作,但具有指定的启动容量。如果您知道需要比默认值更大的容量,它的性能会更好,因为如果没有足够的容量,它就不必继续扩展编辑:此外,正如@yelliver所述,您可以通过指定来节省内存,这可能取决于您创建的缓冲区对象的数量(或缓冲区的大小)


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

在一般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<>();
String[]arr=list.toArray(新字符串[list.size()]);
//或
字符串[]arr=list.toArray(新字符串[0]);
列表=新的ArrayList(10);
//或
列表=新的ArrayList();
如果允许默认容量:

  • 优点:无需关心容量(显然)
  • 缺点:如果您有意 使用小于默认容量的小尺寸,将浪费 记忆
  • 如果您通过了您的意向能力:

  • 优点:节省内存,您可以准确分配所需的内存
  • 缺点:有时你无法从一开始就知道确切的尺寸,或者尺寸的计算很复杂

  • 在一般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<>();
    
    String[]arr=list.toArray(新字符串[list.size()]);
    //或
    字符串[]arr=list.toArray(新字符串[0]);
    列表=新的ArrayList(10);
    //或
    列表=新的ArrayList();
    
    如果允许默认容量:

  • 优点:无需关心容量(显然)
  • 缺点:如果您有意 使用小于默认容量的小尺寸,将浪费 记忆
  • 如果您通过了您的意向能力:

  • 优点:节省内存,您可以准确分配所需的内存
  • 缺点:有时你无法从一开始就知道确切的尺寸,或者尺寸的计算很复杂