у меня есть
List<String>list = new ArrayList<>();
Мне нужно добавить несколько строк.
Мой код такой
final int howMany = 13;
list.add(howMany+"");
Точно так же, как int не является сериализуемым, я передаю его в строку, я знаю, что эта строка не объединена, это означает, что каждый раз создается объект, потому что создается среда выполнения?
Но в моем коде обозреватель кода меняет его на.
String.valueOf(howMany);
Я только что проверил код и это что-то вроде
return Integer.toString(i);
Что заканчивается на.
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
Что также создает new String().
Теперь мой вопрос: какой код лучше по производительности, лучше читаемый код?
howMany + "" против String.valueOf(howMany)
Я сделал простой бенчмаркинг: String.valueOf() работает медленнее, я думаю ..
final long startTime = System.currentTimeMillis();
for(int i=0;i<99900000;i++){
//final String string = i+"";//2637ms..
final String string = String.valueOf(i);//3600ms..
}
final long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime+"ms..");
String.valueOf() на 50% медленнее, чем i + "".
Использование J.D.K 1.8.0_121
Вы спрашиваете, что такое лучше между howMany + "" и String.valueOf(howMany)?
Лучше? Для хранения Strings, int, Doubles и т. д.? Магазин типа один. List<Integer> например. Если вам нужно хранить несколько вещей, создайте собственный класс, чтобы хранить тип один. List<MyClass> в этом случае является лучше.
Независимо от того, что вы выберете, JIT-компилятор оптимизирует ваш выбор.




Что ж, сначала задаешься вопросом, почему нельзя использовать целое число в коробке, т.е. целое число. В конце концов, у вас уже есть объекты, а не примитивные типы в этом списке ... это то, что я бы попытался написать. Кроме того, как предлагает @MitchWheat - убедитесь, что вы действительно нужно список произвольных Serializable; Часто лучше, если вы можете ограничить типы элементов в ваших списках.
Из двух вариантов предпочтительнее предложение вашего рецензента:
Наконец, о результатах вашего теста - что я вижу, Java - это странно. Я бы рекомендовал удобочитаемость по сравнению с измеренной производительностью для всего, что не является критическим для производительности разделом; и для этого - Java - все равно сомнительный выбор.
... и полностью упускает из виду настоящую проблему!
@MitchWheat: вполне возможно, что список будет содержать произвольные сериализуемые значения. То есть, наверное, я мог бы придумать какой-нибудь вариант использования.
да, я могу, но в остальных 99,99% случаев .....
@MitchWheat: отредактировано на основе вашего комментария. Я не уверен, что это 99,99%.
Ваш код создает две строки, по крайней мере, в том виде, в котором он написан, и независимо от оптимизации компилятора / виртуальной машины, в то время как valueOf () должен создавать только одну. в моем простом тестировании String.valueOf работает медленнее.
@chiperortiz: Опишите, пожалуйста, как именно вы проводили тестирование.
есть в отредактированном вопросе.
String.valueOf(howMany) намного читабельнее, и это, на мой взгляд, главное.
Более того, он делает то же самое, поэтому с точки зрения эффективности он почти идентичен, и я думаю, что всегда лучше быть читаемым.
String.valueOf() лучше по следующим причинам:
другие люди сразу узнают, что вы сделали, потому что вы сделали это так же, как и другие люди.
Вы создаете дополнительную строку, в отличие от другого кода, пустую строку: "", которую необходимо создать, а затем (бесполезно) объединить с преобразованием Java вашего int в String.
Ваш код также проходит более или менее тот же процесс, что и другой код, только за кулисами - Java имеет в основном один алгоритм для изменения целых чисел на строковые представления целых чисел.
более важный вопрос ... почему список содержит вары существенно разных типов?