Какой Java-код лучше?

у меня есть

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

более важный вопрос ... почему список содержит вары существенно разных типов?

Mitch Wheat 17.04.2018 16:15

Вы спрашиваете, что такое лучше между howMany + "" и String.valueOf(howMany)?

Jacob G. 17.04.2018 16:15

Лучше? Для хранения Strings, int, Doubles и т. д.? Магазин типа один. List<Integer> например. Если вам нужно хранить несколько вещей, создайте собственный класс, чтобы хранить тип один. List<MyClass> в этом случае является лучше.

Elliott Frisch 17.04.2018 16:17

Независимо от того, что вы выберете, JIT-компилятор оптимизирует ваш выбор.

killjoy 17.04.2018 16:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
105
3

Ответы 3

Что ж, сначала задаешься вопросом, почему нельзя использовать целое число в коробке, т.е. целое число. В конце концов, у вас уже есть объекты, а не примитивные типы в этом списке ... это то, что я бы попытался написать. Кроме того, как предлагает @MitchWheat - убедитесь, что вы действительно нужно список произвольных Serializable; Часто лучше, если вы можете ограничить типы элементов в ваших списках.

Из двух вариантов предпочтительнее предложение вашего рецензента:

  • Он точно говорит о том, чего вы хотите достичь.
  • Он не представляет артефактов людям, читающим код.
  • Кажется (мне субъективно) более вероятно, что виртуальная машина будет скомпилирована при многократном вызове.
  • Ваш код создает строки два, по крайней мере, в том виде, в котором они написаны, и независимо от оптимизации компилятора / виртуальной машины, в то время как valueOf () должен создавать только одну. редактировать: ... но я признаю, что это не гарантия лучшей производительности.

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

... и полностью упускает из виду настоящую проблему!

Mitch Wheat 17.04.2018 16:18

@MitchWheat: вполне возможно, что список будет содержать произвольные сериализуемые значения. То есть, наверное, я мог бы придумать какой-нибудь вариант использования.

einpoklum 17.04.2018 16:20

да, я могу, но в остальных 99,99% случаев .....

Mitch Wheat 17.04.2018 16:21

@MitchWheat: отредактировано на основе вашего комментария. Я не уверен, что это 99,99%.

einpoklum 17.04.2018 16:23

Ваш код создает две строки, по крайней мере, в том виде, в котором он написан, и независимо от оптимизации компилятора / виртуальной машины, в то время как valueOf () должен создавать только одну. в моем простом тестировании String.valueOf работает медленнее.

chiperortiz 17.04.2018 16:28

@chiperortiz: Опишите, пожалуйста, как именно вы проводили тестирование.

einpoklum 17.04.2018 16:34

есть в отредактированном вопросе.

chiperortiz 17.04.2018 16:34

String.valueOf(howMany) намного читабельнее, и это, на мой взгляд, главное. Более того, он делает то же самое, поэтому с точки зрения эффективности он почти идентичен, и я думаю, что всегда лучше быть читаемым.

String.valueOf() лучше по следующим причинам:

  1. другие люди сразу узнают, что вы сделали, потому что вы сделали это так же, как и другие люди.

  2. Вы создаете дополнительную строку, в отличие от другого кода, пустую строку: "", которую необходимо создать, а затем (бесполезно) объединить с преобразованием Java вашего int в String.

  3. Ваш код также проходит более или менее тот же процесс, что и другой код, только за кулисами - Java имеет в основном один алгоритм для изменения целых чисел на строковые представления целых чисел.

Другие вопросы по теме