В чем разница между буфером (int) и buffer ()? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь отправить пакет клиенту и заметил, что нет ошибки, даже если я не установил начальную емкость.

// 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 с Unpooled.buffer, записываю в него свои данные и отправляю их на канал, используя channel.write(ByteBuf), когда мне нужно что-то отправить на клиент. Я правильно делаю?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Из документов:

  • buffer()

    создает новый буфер кучи Java с прямым порядком байтов с достаточно малой начальной емкостью, который неограниченно расширяет свою емкость по требованию.

  • buffer(int initialCapacity)

    создает новый буфер кучи Java с прямым порядком байтов с указанной емкостью, который неограниченно расширяет свою емкость по требованию. Для нового буфера readerIndex и writerIndex равны 0.

Итак, buffer(int) делает то же самое, что и buffer(), но с заданной начальной емкостью. Он будет работать лучше, если вы знаете, что вам нужна большая емкость, чем по умолчанию, так как он не будет продолжать расширяться, если не хватает емкости. edit : также, как сказал @yelliver, вы можете сэкономить память, указав, что может складываться в зависимости от того, сколько объектов буфера вы создаете (или в зависимости от размера буфера).

Похоже, buffer(int) также устанавливает некоторые индексы, которые buffer() не могут.

0 голосов
/ 31 августа 2018

Вообще, во многих случаях вы можете передавать пропускную способность или нет, оба в порядке. Если вы не передадите емкость, она будет иметь емкость по умолчанию. Когда емкость заполнена, она автоматически расширяется. Например:

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. Минусы : Иногда вы не можете точно узнать точный размер с начала, или расчет размера затруднен
0 голосов
/ 31 августа 2018

Разница в том, что они имеют разную начальную емкость.

См. buffer() документ:

Создает новый буфер кучи Java с прямым порядком байтов с достаточно малым начальная мощность , что неограниченно расширяет ее по требованию.

и buffer(int initialCapacity) документ:

Создает новый буфер кучи Java с прямым порядком байтов с указанной емкостью , который безгранично расширяет свои возможности по требованию.

...