JavaRush /Курсы /Java Multithreading /Number (Integer, Long, Byte)

Number (Integer, Long, Byte)

Java Multithreading
9 уровень , 4 лекция
Открыта

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

Во-первых, придумали абстрактный класс Number (число), от которого унаследованы типы Byte, Short,Integer, Long, Float, Double. У него есть методы, которые помогают преобразовывать числа к другим числовым типам.

Методы класса Number
1
int intValue()
2
long longValue()
3
float floatValue()
4
double doubleValue()
5
byte byteValue()
6
short shortValue()

— Действительно, ведь уже не напишешь:

Long x = 100000;
Integer y = (Integer) x;

— Ага. Типы то не примитивные. Поэтому используют методы класса Number:

Long x = 100000;
Integer y = x.intValue();

Но тут есть еще пара моментов. Т.к. Integer – это не int, то объекты такого типа нельзя сравнивать классическим знаком «==».

Сравнение примитивных типов
int x = 500; int y = 500;
x == y; //true
Сравнение непримитивных типов:
Integer x = 500; Integer y = 500;
x == y; //false 
x.equals(y); //true

— Точно. Как-то я сразу об этом не подумал.

— Но и это еще не все.

— Господи, что же там еще-то?

— Когда мы присваиваем переменной типа Integer значение типа int, при этом вызывается метод Integer.valueOf:

Код Что происходит на самом деле
Integer x = 5;
Integer x = Integer.valueOf(5);

— Ага. Я это понял еще примером выше.

— Так вот, функция valueOf не всегда создает новый объект типа Integer.

— Т.е. как это не всегда?

— Она кэширует значения от -128 до 127.

Код Что происходит на самом деле Описание
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Все переменные x,y,z содержат ссылки на разные объекты
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
Все переменные x,y,z содержат ссылки на один и тот же объект.
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = 10;
Integer t = 10;
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = Integer.valueOf(10);
Integer t = Integer.valueOf(10);
Все переменные z,t содержат ссылки на один и тот же объект.

Т.е. ситуация такая:

1) Если мы пишем new Integer(), то гарантированно создается новый объект.

2) Если мы вызываем Integer.valueOf(), явно или при autoboxing, то этот метод может вернуть для нас как новый объект, так и отдать объект из кэша, если переданное число лежит в диапазоне от -128 до 127.

— А что в этом такого страшного, если метод вернет объект из кэша?

— Да ничего. Просто нужно знать, что иногда, когда этого не ожидаешь, объекты могут быть равны. Там с равенством вообще все сложно. Если мы сравниваем примитивный тип и не примитивный, то они сравниваются как примитивы:

Пример проблемы со сравнением:
int x = 300;
Integer y = 300;
Integer z = 300;

x==y; //true (сравниваются как примитивы по значению)
x==z; //true (сравниваются как примитивы по значению)
y==z; //false (сравниваются по ссылке)
Этот пример еще интереснее. Тут уже в дело вступает кэш
int x = 100;
Integer y = 100;
Integer z = 100;

x==y; //true (сравниваются как примитивы по значению)
x==z; //true (сравниваются как примитивы по значению)
y==z; //true (сравниваются по ссылке, ссылаются на один и тот же объект)
А тут кэш уже не работает
int x = 100;
Integer y = new Integer(100);
Integer z = 100;

x==y; //true (сравниваются как примитивы по значению)
x==z; //true (сравниваются как примитивы по значению)
y==z; //false (сравниваются по ссылке, ссылаются на различные объекты)

— М-да. И как все это запомнить…

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

Еще советую тебе посмотреть на методы класса Integer, у него довольно много хороших и полезных методов. Ты даже одним из них часто пользовался.

— Ага. Помню. Integer.parseInt();

Комментарии (50)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Daniel Уровень 51
16 февраля 2023
Не думал, что такое возможно, но что-то я начинаю переживать, как бы материи хватило до конца..
Denis Rogov Уровень 1 Expert
10 марта 2023
это рофл или сириосли?)
Daniel Уровень 51
10 марта 2023
Я подзабил на большие задачи в этом модуле, и без них у меня сейчас 600 материи. Пройду, если придется, но мне прям совсем не зашел сам подход этих мини-проектов. Просто решаешь локальные задачи без понимания общей картинки. Как это будет работать? Зачем именно этот кусок нужен? Почему вообще так сделано? Не говоря уже о том что некоторые куски кода за тебя дописывают, а твой периодически меняют. Такой подход вообще не помогает при разработке чего-то своего. Сидишь, пялишься в пустой экран и пытаешься придумать, как вообще вся система должна работать.
Loony.java Уровень 46
29 мая 2023
Если стоит выбор - писать код или нет, то я лучше буду его писать(а заодно и читать то, что за меня дописали, это вроде как полезно),порой просто "потому что так сказали написать", порой более осмысленно, а иногда вообще со скрипом и матюкамии.
Daniel Уровень 51
29 мая 2023
Пишите, кто ж вам мешает. Но свой код. Со своей структурой и архитектурой, основываясь на понимании общей модели. Набирая полностью чужой код по его описанию вы не научитесь одному из важнейших навыков: декомпозиции. Видишь задачу - разбей ее на куски. Пойми, что вообще нужно сделать и как это сделать известными тебе инструментами. Не хватает инструментов - найди недостающие и собери этот конструктор. Это очень сильно отличается от: перед вами набор лего со всеми нужными деталями где за вас придумали, как это совместить, поэтому просто следуйте инструкции.
Loony.java Уровень 46
30 мая 2023
Ваше мнение мне тоже нравится, именно в последнем комментарии) Но и от своего я не отказываюсь - чем больше пишешь и читаешь, тем быстрее осваиваешь чужой код, да и информация новая легче усваивается, но это личные наблюдения)
14 августа 2025
О боги, это что сейчас было? Спор двух образованных людей? Если бы все на планете так грамотно выражали свою точку зрения и умели принимать (пускай и не соглашаться) с чужой, то на земле наступила бы гармония
Anton Rahm Уровень 31
15 января 2023
Пример проблемы со сравнением: int x = 300; Integer y = 300; Integer z = 300; x==y; //true (сравниваются как примитивы по значению) x==z; //true (сравниваются как примитивы по значению) y==z; //false (сравниваются по ссылке) Этот пример еще интереснее. Тут уже в дело вступает кэш int x = 100; Integer y = 100; Integer z = 100; x==y; //true (сравниваются как примитивы по значению) x==z; //true (сравниваются как примитивы по значению) y==z; //true (сравниваются по ссылке, ссылаются на один и тот же объект) это из этой лекции, кто то может пожалуйста объяснить, почему в первом примере y==z false, a во втором, true?хотя оба не примитивные типы и оба ссылаются на одно и то же значение в первом случае на 300 во втором на 100,благодарю
Grustnij Los' Уровень 2
18 января 2023
Как сообщается нам в лекции, это происходит потому, что 300 лежит вне диапазона -128 ... 127 и не кешируется, а 100 внутри него, кешируется и ссылается на один и тотже объект. Вероятно чтобы не путаться, лучше использовать equals.
Станислав Future Уровень 39
30 августа 2022
Вот уж не подумал бы, что меня сможет удивить Integer на 39 уровне. От кого дальше ждать сюрпризов?
Kurama Уровень 50
2 декабря 2022
От Boolean
Фарид Гулиев Уровень 41
28 июня 2022
То есть, можно просто сравнивать через equals() и не парится?
Zhulien Уровень 16
10 апреля 2022
не понмаю чего лекция закрыта😐 у меня 10 уровень
Зепп Бранниган Уровень 1 Moderator
13 апреля 2022
Это 9-я лекция квеста Multithreading, до которого Вы еще не дошли. Для начала закончите Java Syntax и Java Core😉
29 января 2022
основы наше все)))
Уровень 51
29 ноября 2021
все понятно че сложного?
Макс Дудин Уровень 41
5 октября 2021
ух ты.... 🤔 как замучено на ровном месте...
18 апреля 2021
про Integer и equals действительно шок. и в чём тогда смысл автоКоробки если она == сама не может переделать в то что от нее требуют? одним словом на Компилятор надейся, а сам не плошай!
Valua Sinicyn Уровень 41
19 января 2021
 
Long x = 100000L;  // L в конце забыли 
 
Kurama Уровень 50
2 декабря 2022
Или

Long x = (long) 100000;
😅