StringBuilder - setLength (0) против нового экземпляра, что лучше? - PullRequest
0 голосов
/ 08 января 2020

у меня есть все oop (повторяется 2 раза за каждую итерацию, когда я получаю данные от Bluetooth), и я использую StringBuilder для отдельного добавления данных, а в конечном процессе мне нужно очистить StringBuilder obj ,

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

Пример кода, который получить данные с устройства Bluetooth:

 private void receive(byte[] data) {
     peso.append(new String(data));
     receiveText.setText(peso.toString().replaceAll("(\\r|\\n)", "")+" Kg"); 
     // int i = Integer.parseInt(peso.toString().replaceAll(("\\r|\\n"), ""));
     Log.i("Val of append actual", String.valueOf(peso));

     if(peso.length() >= 3) 
         peso = new StringBuilder();

 }

Прочие сведения: я знаю максимальный размер моего «песо», это может помочь при выборе?

Ответы [ 3 ]

3 голосов
/ 08 января 2020

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

Разница в производительности действительно незначительна, но Ваш код будет проще.

2 голосов
/ 08 января 2020

Я даже читал, что new StringBuilder был быстрее в одном случае. Так что это более или менее нерелевантная микрооптимизация. Профилируйте это в вашем случае. Я бы дал начальную емкость: new StringBuilder(64).

Примечания:

  • В настоящее время if (peso.length() >= 3), вероятно, для тестирования.
  • Укажите Charset для data байты. Best StandardCharsets.UTF_8.
  • Регистрация ведется медленно; удалите его.
  • Регулярное выражение медленное. Ниже приведена замена без регулярных выражений.
  • \ R для любой новой строки, \ n, \ r \ n, \ r, NEL.

Итак:

 private void receive(byte[] data) {
     peso.append(new String(data, StandardCharsets.ISO_8859_1));
     String pesoS = peso.toString();
     //receiveText.setText(pesoS.replaceAll("\\R", "")+" Kg");
     receiveText.setText(pesoS.replace("\r", "").replace("\n", "")+" Kg"); 
     Log.i("Val of append actual", pesoS);

     if (peso.length() >= 3) 
         peso = new StringBuilder(16);
 }
1 голос
/ 08 января 2020

Создание может быть медленным, потому что создание нового объекта требует времени, но удаление содержимого из StringBuilder не требует процесса выделения памяти для его внутреннего массива, что делает процесс лучше и быстрее.

...