Здравствуйте, TNL, Вы писали:
TNL>...
TNL>Нет, это два указателя на один объект. Неизменяемый. Размещенный в пуле объектов. TNL>Все целочисленные типы-обертки для чисел меньше 128 используют пул.
Ну приехали.
Если бы это были ссылки на один и тот же объект, следующий фрагмент кода печатал бы true
System.out.println(new Integer(1) == new Integer(1)); // prints false
Пул используется при вызове valueOf() (явном или неявном, который генерится при автобоксинге);
System.out.println(Integer.valueOf(1) == Integer.valueOf(1)); // prints true
TNL>Так же пул используется для строк, данных в кавычках.
Не только для литералов. Там все намного продвинутее.
Здравствуйте, denis.zhdanov, Вы писали:
DZ>Да, с точки зрения логики это неправильно. К сожалению, в джаве многие вещи (в т.ч. базовые) не реализованы так, как должно/не реализованы вообще. Плюс Sun очень заботится об обратной совместимости, т.о. баги, присутствующие в начальной реализации просто не фиксятся в новых версиях, чтобы не сломать существующий код. Это можно считать минусом, можно считать плюсом, в любом случае это надо принять как данность и просто знать такие моменты (напарываться на баги и узнавать о них).
Просто надо помнить, что в Java существует не две, а три базовые штуки. Object и все что от него растёт, примитивы и массивы. И хоть массивы и можно кастить к Object и в JLS явно сказано, что Array extends Object, это (пусть меня тут побьют эксперты) не чистый A extends Object implements Cloneable, Serializable (то, что это специальный хакнутый нечистый Object я лично думаю из-за метода clone, который приведен в JLS — там показан вызов к super.clone, т.е. к нативному методу Object). Я лично думаю, что массивы — это синтетический (несуществующий) класс, поддержанный на нативном уровне JVM и не имеющий никакого специального представления в байткоде. Я имею ввиду полноценное A extends Object. Нету этого.
Хотя вообщем в данном случае Sun просто схалявила. Реализовали для массивов метод clone, но не реализовали equals. А могли в легкую (или нет?) это сделать. Но видимо все дело в том, что это специальными хаками в JNI делается. И нативный метод clone переопределить для массивов можно легко, а вот ненативный equals — как-то совсем не тривиально. Поэтому используется реализация от Object, а она сравнивает ссылки.
Здравствуйте, aefimov, Вы писали:
A>Здравствуйте, TNL, Вы писали:
J>>>Тоже два указателя на разные объекты.
TNL>>Нет, это два указателя на один объект. Неизменяемый. Размещенный в пуле объектов. TNL>>Все целочисленные типы-обертки для чисел меньше 128 используют пул. TNL>>Так же пул используется для строк, данных в кавычках.
A>Вы все перепутали. Это два разных объекта. И это гарантируется оператором new. A>Пул используется для автобоксинга, но там не new, а valueOf
Хех... Все, пора завязывать с праздниками! Через неделю придется заново алфавит вспоминать ))). Прошу прощения.
Здравствуйте, TNL, Вы писали:
A>>Вы все перепутали. Это два разных объекта. И это гарантируется оператором new. A>>Пул используется для автобоксинга, но там не new, а valueOf
TNL>Хех... Все, пора завязывать с праздниками! Через неделю придется заново алфавит вспоминать ))). Прошу прощения.
Наоборот же. С праздниками пора начинать!
Re[6]: Ну так нечестно - Java (код внутри)
От:
Аноним
Дата:
29.12.07 19:33
Оценка:
TNL>>Так же пул используется для строк, данных в кавычках.
DZ>Не только для литералов. Там все намного продвинутее.
Здравствуйте, denis.zhdanov, Вы писали:
DZ>Ну приехали. DZ> DZ> Если бы это были ссылки на один и тот же объект, следующий фрагмент кода печатал бы true DZ>
DZ>System.out.println(new Integer(1) == new Integer(1)); // prints false
DZ>
DZ> Пул используется при вызове valueOf() (явном или неявном, который генерится при автобоксинге); DZ>
DZ>System.out.println(Integer.valueOf(1) == Integer.valueOf(1)); // prints true
DZ>
DZ>
Едем дальше:
System.out.println(Integer.valueOf(1) == Integer.valueOf(1)); // prints true. WTF???
Можно посмотреть в метод Integer.valueOf:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
R>Тогда наверно надо начать с претензии: почему нет java.lang.Array<T>, как это например сделали в Scala.
Нет, начать, или, вернее, продолжить следует признанием того, что ты в своем первом посте пронес полнейшую чушь, а потом на протяжении всей ветки пытался эту чушь защищать
"Больше 100кмч можно ехать на автобане в любом ряду кроме правого крайнего" (c) pik
"В германии земля в частной собственности" (c) pik
"Закрывать школы, при нулевой смертности среди детей и подростков, это верх глупости" (c) Abalak
"Больше 100кмч можно ехать на автобане в любом ряду кроме правого крайнего" (c) pik
"В германии земля в частной собственности" (c) pik
"Закрывать школы, при нулевой смертности среди детей и подростков, это верх глупости" (c) Abalak
Здравствуйте, Аноним931, Вы писали:
А>Нет, начать, или, вернее, продолжить следует признанием того, что ты в своем первом посте пронес полнейшую чушь, а потом на протяжении всей ветки пытался эту чушь защищать
Конкретно, с чем не согласны-то и где-чего я пытался защищать?