Пару слов о Джаве
У ДиБРа увидел прекрасное. Как вы думаете, что выведет следующий код:
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». Насколько я понял по комментариям, это происходит из-за того, в Джаве экземпляры Integer (видимо для скорости) в диапазоне [-128; 127] предопределены. Поэтому объекты «a» и «b» равны (ссылаются на один объект), а «c» и «d» нет. А на равенство значений надо проверять вызовом метода «equals».
Представляю сколько часов потрачено на поиски и исправления багов связаных с таким поведением ...
В связи с этим вспомнился, почему—то, недавний наезд на PHP...
Есть замечательная книжка, называется Java Puzzlers http://www.javapuzzlers.com. Там сотня глав, попадается очень забавное.
Ну, и сама концепция, object interning, много где используется. :)
Комментарий для bealex.moikrug.ru:
Процитируй что-нибудь :)
Там исходники доступны, вот несколько понятных, если интересно, расскажу, что получается:
System.out.print(«H» + «a»);
System.out.print(’H’ + ’a’);
-- 1.
System.out.println((int) (char) (byte) -1);
-- 2.
int j = 0;
for (int i = 0; i < 100; i++)
j = j++;
System.out.println(j);
-- 3.
int i = 0;
while (i == i + 1) { }
--
Это простые, там есть и с многопоточностью, с классами, со стандартной библиотекой... Не могу найти с тернарным оператором, там неявное приведение типов забавное.
«как ни странно»
Комментарий для bealex.moikrug.ru:
Интересно, конечно!
Комментарий для fulc.ru:
Спасибо!
Лучше, конечно, книжку прочитать, часть из вещей общеполезна :) А тут примерно так:
Ну дык объект и примитив разные вещи. Хочешь арифметику — пользуй примитивы, хочешь ООП — объекты. Мешаешь вместе — ССЗБ.
Комментарий для Eyeless:
Вот «Пайтон» мне нравится тем, что там нет примитивов.
Комментарий для Евгения Степанищева:
Из секретных источников (на самом деле на JavaOne рассказали) стало известно, что в 9-й или 10-й джаве тоже не будет примитивов. Но вот это поведение вряд ли изменится в силу того, что у джавы должна быть обратная совместимость. Ещё есть кэш строковых констант, кстати.
Комментарий для Илья Ермолов (twitter.com/iErmolov):
Ну, интернирование статических строк есть вообще почти везде.
Это JAVAAAAAAA!!!111
А если серьёзно, то пару раз нарвавшись на подобные вещи, быстро привыкаешь смотреть в исходники стандартных пакетов. У санок-то оно ещё ничего, а в айбиэмовской жабе местами такие чудеса попадаются, что просто диву даёшься, как такое вообще ухитряется работать в mission critical appliances...
Комментарий для PastorGL:
Ну, это не только в Джаве же такое есть. Например, у Пайтона тоже может оказаться, что ID двух разных (с точки зрения программиста) объектов — одно и то же. Но операция сравнения значений в языке — два равно, что всё-таки более интуитивно.
Комментарий для Евгения Степанищева:
В CPython, кстати, тоже статически выделена память для маленьких чисел (у меня в 2.7 это диапазон [-5, 256]).
А в Jython подобный диапазон [-100, 899].
Работает подобный пример, только, естественно, с оператором «is» вместо «==».
В том же духе в CPython, например, переиспользуются строки, встречаемые в коде (имена классов, методов, переменных, ключевые слова, etc).
для сравнения объектов необходимо использовать метод equals, читайте букварь
Комментарий для stafi:
Вы до конца-то мой пост прочитали? Или только букварь умеете читать?