Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals()
проверьте фактическое содержимое строки (значение).
Обратите внимание, что метод .equals()
принадлежит классу Object
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s2; //true
s1.equals(s2); //true
Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле. String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2; //false
s1.equals(s2); //true
Причина. Если вы создаете объект String с использованием ключевого слова new
, ему выделяется отдельное пространство в куче. Как вы могли прочитать в руководстве, JG интерпретирует флаги, как если бы сравнение было подписано, а JA интерпретирует флаги, как если бы сравнение было неподписанным (конечно, если операция, устанавливающая флаги, не была сравнением или вычитанием , что может не иметь смысла). Так что да, они разные. Если быть точным,
ja
скачет, если CF = 0 и ZF = 0 jg
скачки, если ZF = 0 и SF = OF Например,
cmp eax, edx
ja somewhere ; will go "somewhere" if eax >u edx
; where >u is "unsigned greater than"
cmp eax, edx
jg somewhere ; will go "somewhere" if eax >s edx
; where >s is "signed greater than"
>u
и >s
соглашаются на значения с верхним битом нуль, но значения с верхним битовым набором считаются отрицательными на >s
и как большой на >u
(конечно, если оба операнда имеют верхний бит, >u
и >s
согласны снова).
ja
игнорирует флаг знака (SF). Пример ввода .. – harold 3 January 2014 в 17:17