Почему сравнение переменных Double возвращает false? - PullRequest
2 голосов
/ 28 января 2011

Почему сравнения строк возвращают true, тогда как двойные сравнения возвращают false?

String s1 = "a";
String s2 = "a";
System.out.println(s1 == s2); // true

Double d1 = 1D;
Double d2 = 1D;
System.out.println(d1 == d2); // false

У меня есть мысли по этому поводу, но мне всегда приятно сначала услышать от вас.

1 Ответ

10 голосов
/ 28 января 2011

Строковые литералы интернированы - автоматически помещены , удваивается - нет.Для других автобоксов можно гарантированно использовать кэшированные объекты:

Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2); // true, guaranteed

Обратите внимание, что только гарантировано для значений от -128 до 127, но работает и для больших значений.См. раздел 5.1.7 JLS для получения дополнительной информации.

Обратите внимание, что для строк это действительно только из-за интернирования строковых констант:

String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1 == s2); // false

... тогда как для целочисленного бокса повторное использование кэшированных значений выполняется при исполнение время:

int x = 10;
x -= 9;
Integer i1 = x;
Integer i2 = 1;
System.out.println(i1 == i2); // true, guaranteed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...