Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет dibr ([info]dibr)
@ 2012-04-21 16:19:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
программизм

     Утащено у Imagestdray (xc lj). У него там ещё пара ссылок есть :-)

     Как вы думаете, что выведет этот код на Java?
public class Main {
    public static void main(String[] args) {
        Integer a = 10, b = 10; 
        Integer c = 150, d = 150;
        System.out.println(a == b);
        System.out.println(c == d);
    }
}
     Правильный ответ:
true
false

     Внезапно, да? Но как?!

     Я вот - не догадался (правда, я и яву не знаю). Кому интересно - прозрачный намёк здесь, ответ - у Imagestdray :-)


(Читать комментарии) - (Добавить комментарий)


[info]ilya_314@lj
2012-04-21 14:32 (ссылка)
Да, интересный пример. Собственно Integer это специальный класс, а не базовый тип "int", чего в не "managed" языках совсем нет, поэтому те, кто не работал с этим и недоумевают.

С другой стороны, по опыту участия в собеседованиях, обращал внимание, что не все программисты java/c# понимают в чем разница ref-типа (объекты в managed куче) и value-типы - это те, которые базовые типы и простые структуры не хранящиеся в куче и передающиеся по значению.

(Ответить) (Ветвь дискуссии)


[info]metaclass@lj
2012-04-21 15:44 (ссылка)
Вроде про различие value- и ref-типов написано в каждой книжке по языкам в первой-второй главе.
А вот про то, что boxed значения можно создать заранее и возвращать готовыми - особенность реализации, до которой сходу и не додумаешься.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dibr@lj
2012-04-21 16:53 (ссылка)
Так это-то понятно, и что "fsck"=="fsck" в общем случае false (хотя возможны и исключения) я понимаю. Но что Integer может оказаться не "базовым типом, передаваемым по значению", а чем-то более сложным - для меня как-то неожиданно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blacklion@lj
2012-04-21 17:17 (ссылка)
Integer vs int, ага?
Надеюсь, к 8-ой яве изведут базовые типы вообще, ненужны они.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-21 18:03 (ссылка)
Ага. Особенно если сравнить расход памяти на массив intов и Integerov.
ЕМНИП, на 64битной машине разница будет в четыре раза.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dmzlj@lj
2012-04-22 01:39 (ссылка)
компилятор может автоматически анбоксить, в принципе.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-22 06:36 (ссылка)
В выражениях может. А при создании не может.
Потому как ему неизвестно, нужен тут примитив, или таки кто-то хочет как объект использовать.

(Ответить) (Уровень выше)


[info]blacklion@lj
2012-04-22 04:43 (ссылка)
Это решаемая задача. Как и скорость выполнения.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-22 06:36 (ссылка)
Каким образом? Поставить больше памяти?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blacklion@lj
2012-04-22 06:42 (ссылка)
Вы себе не представляете, на что способны современные JIT'ы.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-22 07:00 (ссылка)
Забить на спецификацию языка?
Или он действительно не будет создавать служебную информацию класса, пока кто-то к ней не обратится?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blacklion@lj
2012-04-22 10:22 (ссылка)
Именно. Делаем эксепшн на slow path, если туда таки сунуться — ну, генерим заголовки. Если не сунуться — всё быстро.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-22 13:13 (ссылка)
А что будет с массивом из миллиона объектов, каждый из которых будет генерить эксепшн?
В общем, применение примитивов пока вполне оправдано, мне кажется.

(Ответить) (Уровень выше)


[info]dmzlj@lj
2012-04-22 01:36 (ссылка)

честно говоря, видя код a.equal(b) хочется проблеваться. надеюсь, вместо изведения базовых типов они введут, наконец, перегрузку операторов и тайпклассы

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blacklion@lj
2012-04-22 04:43 (ссылка)
Да, с .equal() конкретный продолб, тут тоже спорить не буду.

(Ответить) (Уровень выше)


[info]azgar@lj
2012-04-22 06:43 (ссылка)
Ага.
А потом ещё добавят ДЕФАЙН и отменят автоматическое освобождение памяти.
И получится Це Плюс Плюс.

(Ответить) (Уровень выше)


[info]dibr@lj
2012-04-21 16:50 (ссылка)
Вот я и не ожидал, что Integer - не базовый тип. Казалось бы - зачем делать "объект" типа "целое число", чего такого может быть в этом объекте, чего не умеет базовый тип "int"?..

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]starcat13@lj
2012-04-21 16:52 (ссылка)
например запихиваться в контейнеры, которые умеют работать только с объектами.

(Ответить) (Уровень выше)


[info]azgar@lj
2012-04-21 18:04 (ссылка)
Куча разной служебной информации.
Как бонус :) возможность положить в коллекцию или присвоить null.

(Ответить) (Уровень выше)


[info]nlothik@lj
2012-04-21 18:32 (ссылка)
Это удобный wrapper class, там много разных полезных методов.

Например, можно написать так:

String a = "400";
int b = Integer.parseInt(a);

И не мучаться с парсингом другого типа данных.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-22 06:45 (ссылка)
Статические методы можно без экземпляра вызвать. Т.е. для этого не нужно создавать Integer.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]nlothik@lj
2012-04-22 18:55 (ссылка)
Я и не создавал.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]azgar@lj
2012-04-23 03:29 (ссылка)
Я к тому, что для сервисных методов не обязательно иметь именно класс Integer.
Можно поместить их в любой IntUtil, который сам по себе не будет представлять целое число.

(Ответить) (Уровень выше)


[info]ilya_314@lj
2012-04-21 18:58 (ссылка)
Главное - это превращение в объект. Все объекты в подобных языках имеют одного предка с некоторым набором стандатных методов. Как верно заметили - таким образом можно организовывать полиморфные контейнеры не прибегая к шаблонам/дженерикам. Для подобных преобразований ref-type <-> value-type есть специальная терминология boxing/unboxing.

(Ответить) (Уровень выше)


(Читать комментарии) -