Чому ==, що приводить до істини, в Long об'єкті

In this piece of code (story * 2) == tail is getting True

і false для distance + 1! = tail .

== checks for reference , as Long is immutable , it will false for two different objects,

Тут значення story * 2 стає рівним за посиланням tail , але вони є двома різними об'єктами, а не константами часу компіляції для об'єднання.

   public class Test2 
{
         public static void main(String [] args) {

              Long tail = 2000L;
              Long distance = 1999L;
              Long story = 1000L;

                  System.out.println(tail > distance);

                  System.out.println((story * 2) == tail);

              if((tail > distance) ^ ((story * 2) == tail))
                  System.out.print("1");

              System.out.println(distance + 1 != tail);
              System.out.println((story * 2) == distance);

              if((distance + 1 != tail) ^ ((story * 2) == distance))
              System.out.print("2");

}

Я перевірив тут , але ніяких пояснень для цього немає.

4
ви повинні прийняти відповідь NPE :)
додано Автор Marek, джерело
Ознайомтеся з цією відповіддю: - stackoverflow.com/questions/10149959/ …
додано Автор Marek, джерело
Ознайомтеся з цією відповіддю: - stackoverflow.com/questions/10149959/ …
додано Автор Marek, джерело
ви повинні прийняти відповідь NPE :)
додано Автор Marek, джерело
який jdk ви використовуєте
додано Автор stinepike, джерело
@Pathashu зауважте, що значення в питанні більше 127, я вважаю, що кешування тут не є причиною
додано Автор Andreas Fester, джерело
Ціле число, але не довге, для цілого числа -128 до 127 кешуються, але не довго і, звичайно, не в цьому питанні, оскільки значення більше 127
додано Автор anshulkatta, джерело
@Marek немає, це не відповідь, вже перевірено, в тому, що цілі цінні значення менше 128, от чому це стає справді
додано Автор anshulkatta, джерело
@Marek немає, це не відповідь, вже перевірено, в тому, що цілі цінні значення менше 128, от чому це стає справді
додано Автор anshulkatta, джерело
@ StinePike jdk versoin 1.6
додано Автор anshulkatta, джерело
@ StinePike jdk versoin 1.6
додано Автор anshulkatta, джерело

6 Відповіді

7
додано
тому що один із елементів порівняння є примітивним. У такому випадку JVM завжди відкидає тип на примітив.
додано Автор Damian Leszczyński - Vash, джерело
(історія * 2) призводить до довгого, нормально, тоді == виконується між довгим і довгим, чому для == Long буде автоматично вставлено
додано Автор anshulkatta, джерело
7
додано
тому що один із елементів порівняння є примітивним. У такому випадку JVM завжди відкидає тип на примітив.
додано Автор Damian Leszczyński - Vash, джерело
(історія * 2) призводить до довгого, нормально, тоді == виконується між довгим і довгим, чому для == Long буде автоматично вставлено
додано Автор anshulkatta, джерело

Я вважаю, це пов'язано з автоматичним розпакуванням, коли ви робите (історія * 2), що призводить до примітивного значення 2000L. І коли порівнюєте його з хвостом, який також має значення 2000L, то результат є істинним. Перевірте тут правило x == y, коли один елемент є примітивним.

enter image description here

Source: http://www.javapractices.com/topic/TopicAction.do?Id=197

4
додано
Довгий час перетворюється на довгий час (історія * 2) через автоматичне розпакування.
додано Автор Juned Ahsan, джерело
так, і хвіст перетворюється на довгий, оскільки == трапляється лише між примітивами, якщо це примітивний, тоді об'єкт змінюється на примітив
додано Автор anshulkatta, джерело
зрозумів дякую !! прочитайте на javapractices.com/topic/TopicAction.do?Id=197
додано Автор anshulkatta, джерело
чому довго перетворюється довго, а не назад, коли == відбувається ??
додано Автор anshulkatta, джерело
спасибі за цей jpg, врятував мій день :)
додано Автор anshulkatta, джерело

Я вважаю, це пов'язано з автоматичним розпакуванням, коли ви робите (історія * 2), що призводить до примітивного значення 2000L. І коли порівнюєте його з хвостом, який також має значення 2000L, то результат є істинним. Перевірте тут правило x == y, коли один елемент є примітивним.

enter image description here

Source: http://www.javapractices.com/topic/TopicAction.do?Id=197

4
додано
Довгий час перетворюється на довгий час (історія * 2) через автоматичне розпакування.
додано Автор Juned Ahsan, джерело
зрозумів дякую !! прочитайте на javapractices.com/topic/TopicAction.do?Id=197
додано Автор anshulkatta, джерело
так, і хвіст перетворюється на довгий, оскільки == трапляється лише між примітивами, якщо це примітивний, тоді об'єкт змінюється на примітив
додано Автор anshulkatta, джерело
чому довго перетворюється довго, а не назад, коли == відбувається ??
додано Автор anshulkatta, джерело
спасибі за цей jpg, врятував мій день :)
додано Автор anshulkatta, джерело

Умноження, додавання та інші операції можуть виконуватися лише на примітив ...

Коли ви виконуватимете ці операції, всі перенесені в коробці примітиви будуть розблоковані та розглядаються як примітивні типи.

Отже, у вашому прикладі == перевіряє довгу рівність, а не об'єкт рівності.

0
додано

Умноження, додавання та інші операції можуть виконуватися лише на примітив ...

Коли ви виконуватимете ці операції, всі перенесені в коробці примітиви будуть розблоковані та розглядаються як примітивні типи.

Отже, у вашому прикладі == перевіряє довгу рівність, а не об'єкт рівності.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників