Непоследовательное поведение на Java ==

  1. string s = (string)o; Использование, когда что-то должно определенно быть другой вещью.
  2. string s = o as string; Использование, когда что-то могло бы быть другая вещь.
  3. string s = o.ToString(); Использование, когда Вы не заботитесь о том, что это всего лишь, Вы просто хотите использовать доступное строковое представление.
8
задан AlbertoPL 18 July 2009 в 23:07
поделиться

7 ответов

Автобоксирование примитивов в объекты (как используется в ваших вызовах метода , использует кэш малых значений. Из раздела 5.1.7 Java Language Specification, ]:

Если упаковываемое значение p истинно, ложь, байт, символ в диапазоне \ u0000 в \ u007f, или int, или short число от -128 до 127, тогда пусть r1 и r2 - результат любых двух бокс конвертации п. Это всегда случай, когда r1 == r2.

Обсуждаемая часть спецификации, следующая сразу за ней, тоже интересна. Примечательно, что JVM может кэшировать больше значений, если захочет - вы не можете быть уверены в результатах выполнения:

Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);
15
ответ дан 5 December 2019 в 06:38
поделиться

При автобоксировании целые числа от -128 до 127 кэшируются, и возвращается тот же объект-оболочка. То же самое с логическими значениями и значениями char между \ u0000 и \ u007F

Это то, что вы получаете большую часть времени, однако это зависит от реализации JVM.

7
ответ дан 5 December 2019 в 06:38
поделиться

Это связано с тем, что при упаковке целые числа ниже определенного значения (я думаю, 128) относятся к некоторому заранее сконструированному объекту, а более высокие значения - к новым объектам.

2
ответ дан 5 December 2019 в 06:38
поделиться

Autoboxing использует Integer.valueOf (i) , а не new Integer (i), для создания объекта класса Integer.

Как говорили другие, valueOf () использует кеш, в основном для экономии места.

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

1
ответ дан 5 December 2019 в 06:38
поделиться

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

Просто помните, что никогда не используйте == для объектов, о которых вы никогда не знаете. что происходит.

0
ответ дан 5 December 2019 в 06:38
поделиться

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

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

(код из Sun JDK 1.6)

это похоже на интернирование строк, так как оно экономит память и позволяет проверять равенство с помощью ссылки (например, == вместо равно )

0
ответ дан 5 December 2019 в 06:38
поделиться

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

0
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: