Подтвердить что ты не робот

Разница между Long.valueOf(java.lang.String) и новым Long (java.lang.String)?

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

Кодер №1 сделал это:

String strId = "12345678";
...
Long lId = new Long(strId);

Пока кодер # 2 сделал это:

String strId = "12345678";
...
Long lId = Long.valueOf(strId);

Функционально код работает точно так же. Там есть блок try/catch вокруг каждого бита для обработки любого NumberFormatException, который вызывается. Входящее строковое значение представляет собой 8-значную строку, которая представляет десятичную величину: "12345678" и в обоих случаях она правильно преобразуется в Long.

Есть ли какая-либо функциональная разница между передачей строки в конструкторе и использованием Long.valueOf()? Я проверил здесь конструктор doc:

Long (java.lang.String)

и docs для valueOf() здесь:

Long.valueOf(java.lang.String)

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

4b9b3361

Ответ 1

Разница в том, что с помощью new Long() вы всегда создадите новый объект, используя Long.valueOf(), можете вернуть вам кешированное значение long, если значение находится между [-128 to 127].

Итак, вы должны предпочесть метод Long.valueOf, потому что он может сэкономить вам некоторую память.

Если вы видите исходный код для Long.valueOf(String), он внутренне вызывает Long.valueOf(long), исходный код которого я разместил ниже: -

public static Long valueOf(String s) throws NumberFormatException
{
    return Long.valueOf(parseLong(s, 10));
}

public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache 
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}

Ответ 2

Long.valueOf() должен быть предпочтительным: он возвращает кешированные значения Long для некоторых часто используемых значений вместо того, чтобы создавать новый экземпляр в качестве конструктора.

Даже если некоторые версии Java не используют кеш, использование valueOf() делает возможным в будущих версиях, тогда как конструктор всегда будет создавать новый экземпляр.

Ответ 3

Они означают один и тот же

public static Long valueOf(String s) throws NumberFormatException{
        return new Long(parseLong(s, 10));
}

public Long(String s) throws NumberFormatException {
    this.value = parseLong(s, 10);
}

Источник JDK 6.0

Ответ 4

Оба делают parseLong(String, int) внутренне (int является основанием со значением как 10), но valueOf имеет преимущество, как описано ниже:

If a new Long instance is not required, this method should generally be used in preference to the constructor Long(long), as this method is likely to yield significantly better space and time performance by caching frequently requested values.

Ответ 5

Это плагин PMD, который запускается на eclipse

Код, который я проверил,

Long l = new Long("123456");

В JDK 1.5 вызов нового Long() вызывает выделение памяти. Long.valueOf() больше совместим с памятью.

Ответ 6

Я думаю, как изменить диапазон и размер кеша для нашего приложения, перегруженный Longs;

такое изменение не поддерживается j2se api Один из способов - изменить загруженный java-байтовый код с помощью ClassLoader или даже с JVMTI (это позволяет сохранить такой трюк из проекта, как и внешняя настройка)

или, может быть, создать внешний кеш и собственный статический файл cachedValueOf() который является прямым, но код, зависящий от некоторых неадекватных потребностей, не является приятным