LINUX.ORG.RU

В Java что, нельзя Integer'ы по != сравнивать??


0

0

Итак, есть код:
(реализация Фортовского loop на java)

jbf.rst.set(jbf.rst.top_i()+1); // loop variable
System.out.println("top= ...."); // контрольный вывод
if(jbf.rst.top_i() != jbf.rst.pick_i(1))
    jbf.ws.wp = (Integer)jbf.ws.code[jbf.ws.wp];
else
    ...

Функции top_i() и jbf.rst.pick_i(1) возвращают Integer. 
Вершина стека (переменная цикла) и подверишина (граница цикла).

Пока числа < 128 - всё пашет отлично.

Как только граница стновится равной 128 (и более) неравенство всегда
становится верным. Контрольный вывод:

top=128; subtop=128; (top != subtop) = true

128 != 128

Как такое может быть?

Как только поменял условие на 

if(jbf.rst.top_i() - jbf.rst.pick_i(1) != 0)

Всё заработало.

Что это было? :-/
★★★★★

>В Java что, нельзя Integer'ы по != сравнивать??

можно, но ты сравниваешь объекты. есть ещё int - примитивный тип

Pi ★★★★★
()
Ответ на: комментарий от Pi

Знаю. Но полагал, что Java Integer'ы по значению сравнивает, а не по объектам :-/

Вообще-то, ИМХО, идиотизм. Ибо объектное сравнение нужно намного реже, чем по значению.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

>Знаю. Но полагал, что Java Integer'ы по значению сравнивает, а не по объектам :-/

В Java в отличии от C++ нет возможности переопределять операторы, поэтому так и получается.

olegk ★★
()
Ответ на: комментарий от KRoN73

>Ибо объектное сравнение нужно намного реже, чем по значению.

дык использование Integer не по назначению тоже редко ;)

Pi ★★★★★
()
Ответ на: комментарий от seiken

а ещё и в Си нету - как кернел вертится без этого - никто не знает

Pi ★★★★★
()
Ответ на: комментарий от KRoN73

> Знаю. Но полагал, что Java Integer'ы по значению сравнивает, а не по объектам :-/

надо не поЛАГАТЬ а доки читать.

> Вообще-то, ИМХО, идиотизм. Ибо объектное сравнение нужно намного реже, чем по значению.

в зеркале у тебя идиотизм. это всё лишь твоё ИМХО.

P.S. И чегой-то тя на Java потянуло? Не так давно кричал же что тормоз это, да и уступает твоему любимому PHP.

Chapaev
()
Ответ на: комментарий от Chapaev

> можно, но ты сравниваешь объекты.

Сравниваются указатели на объекты, а вовсе не они сами. Чтобы сравнить два объекта, нужно использовать метод equals(obj).

По значению можно операторами == и != сравниваются только примитивные типы.

>Знаю. Но полагал, что Java Integer'ы по значению сравнивает, а не по объектам :-/

Книги читать нужно, книги.

jek_
()
Ответ на: комментарий от anonymous

>Чем native int не угодил?

Потому что стек только Object содержит. Он общий на все виды данных. Соответственно, int туда не положишь.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от Chapaev

>Не так давно кричал же что тормоз это, да и уступает твоему любимому PHP.

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

А про скорость - ты тем более мимо кассы, ибо я как раз приводил частные примеры, где чисто числодробительная задача на Java оказывалась быстрее нативного Си.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от jek_

>Книги читать нужно, книги.

Это полезно только в первых лет 10 программирования и только в первых 10 изучаемых языках :D

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

> Это полезно только в первых лет 10 программирования и только в первых 10 изучаемых языках :D

"Secret hacker rule #11: hackers read manuals" (C).

anonymous
()
Ответ на: комментарий от KRoN73

> Это полезно только в первых лет 10 программирования и только в первых 10 изучаемых языках :D

Ну-ну. Вот из-за такого отношения и появляются на форумах вопросы "а чё эт интеджеры в Джаве не сравниваются?"... :)

jek_
()

Кстати, объясните тогда, почему числа до 128, всё же, сравниваются корректно? :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Я, кстати, с самого начала обсуждения хотел это узнать, но стеснялся спросить

Fedor ★★★
()
Ответ на: комментарий от KRoN73

class Test {
        public static void main(String[] args) {
                for(int i = 0; i < 200; ++i) {
                        Integer a = new Integer(i);
                        Integer b = new Integer(i);
                        System.out.println((a == b) + " " + a.equals(b));
                }
        }
}


У меня под рукой есть только gcj, но он пишет "false true" 200 раз,
 как и ожидается (a и b - разные объекты). Есть 99,99% уверенность в
 том, что Sun-овская делает так же.

anonymous
()
Ответ на: комментарий от anonymous

Твой вариант в Sun ведёт себя также. А вот этот:

class Test { public static void main(String[] args) { for(int i = 125; i < 130; ++i) { Integer a = i; Integer b = i; System.out.println(""+i+":"+ (a == b) + " " + a.equals(b)); } } }

Выдаёт:

125:true true 126:true true 127:true true 128:false true 129:false true

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Ответ прост: просто объекты чисел до 128 создаются заранее и существуют всегда, ибо они нужны весьма часто (ведь каждый раз создавать один и тот же объект неразумно). Поэтому и ссылки на них всегда будут одни и те же -> сравнение будет верным. Но опять же: это не сравнение чисел верно как таковое, а сравнение указателей.

jek_
()
Ответ на: комментарий от jek_

В GCJ своя библиотека классов и поведение может отличаться.

jek_
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.