Если метод equals()
присутствует в классе java.lang.Object
, и ожидается, что он проверяет эквивалентность состояния объектов! Это означает, что содержимое объектов. В то время как ожидается, что оператор ==
проверяет, что фактические экземпляры объекта одинаковы или нет.
Пример
Рассмотрим две различные ссылочные переменные, str1
и str2
:
str1 = new String("abc");
str2 = new String("abc");
Если вы используете equals()
System.out.println((str1.equals(str2))?"TRUE":"FALSE");
, вы получите выход как TRUE
, если вы используете ==
.
System.out.println((str1==str2) ? "TRUE" : "FALSE");
Теперь вы получите вывод FALSE
в качестве вывода, потому что оба str1
и str2
указывают на два разных объекта, хотя оба они имеют одинаковое строковое содержимое. Именно из-за new String()
каждый новый объект создается каждый раз.
Между прочим,
0x0 шестнадцатеричный, как вы все упомянули, но
0 восьмеричный, а не десятичный! : -)
т.е. любое число, начинающееся с 0 (без x) является восьмеричным:
0 = 0 01 = 1 02 = 2 ... 07 = 7 010 = 8 011 = 9 012 = 10 ...
: -)
Проще говоря, дело вкуса. Людям нравится записывать адреса памяти в шестнадцатеричном формате, поэтому запись NULL как 0x0 была бы более классической. Для обычных, как я, достаточно 0.
There is no difference. In C, NULL is often defined to be (void *)0
, but in C++ that's not allowed. A few ancient compilers got this wrong, but they really are ancient.
IMO, it's better to use NULL, as it portrays the intent more clearly, and gives you a nice, easy symbol to S&R when your compiler gets updated to C++ 0x, which will include nullptr
.
0x0
- это просто 0
, записанное в шестнадцатеричной системе счисления. Между ними нет разницы:
0 16 = 0 10 :)
NULL
обычно #define
d to 0
где-то и делает то же самое.
0x0
and 0
represent the same value, so you can use the one that best suits your eye. When we get C++0x, we'll have the keyword nullptr
to represent null pointers of any type.
Никакой разницы
На мой взгляд, 0x0 более явный.
Некоторые люди могут спутать 0 с «0» (0x30 - я видел, как это было).
0x0 - это просто выражение значения 0 в шестнадцатеричном формате. Я сомневаюсь, что компилятор позаботится о разнице.
Итак, на этом сайте есть действительно хорошая информация о NULL: http://c-faq.com/null/index.html
NULL на самом деле является "нулевым указателем" "- так что это может быть тип, например," (void *) 0 ". Это сообщает компилятору, что NULL следует рассматривать не как int, а как «указатель на int». А в C компилятор выдает предупреждения / ошибки, если типы не совпадают.
Значения «0» и «0x0» эквивалентны в C ++. Всякий раз, когда перед числом стоит «0x», это означает, что это значение является шестнадцатеричным представлением этого числа. Например, 0x5 == 5.
Кроме того, 0xA [в шестнадцатеричной системе счисления, с основанием 16) == 10 [с основанием 10].
edit
Вот некоторые источники. В glibc NULL в разных местах определяется по-разному. (почему это должно быть?)
#define NULL ((void *) 0) (stdlib / gmp-impl.h)
#define NULL 0 (posix / getopt1.c)
edit2
ну, похоже, я промахнулся на этом! Извините! (CW'd. Не стесняйтесь голосовать против!)