разница между ==, equals () и instanceof () - PullRequest
0 голосов
/ 12 октября 2010
String s=new String("Computer");
if(s=="Computer")
    System.out.print("equals A");
if(s.equals("Computer"))
    System.out.print("Equal B");

Выход Equal B

Теперь, почему == не производит equals A

что такое instanceof?

Ответы [ 5 ]

5 голосов
/ 12 октября 2010

== является ссылочным равным, как, например, «является ли этот точный объект тем же объектом, что и другой объект?».

Когда вы сделали s, вы создали новый объект, поэтому он выигралэто не тот же объект, что и строка, с которой вы сравниваете его (в зависимости от используемой вами JVM "foo" == "foo" будет иметь значение true, поскольку он будет использовать тот же объект внутри).

Когда вы вызываете .equals() it (String s) запустил собственную логику, чтобы определить, что это тот же объект.В случае String он будет сравнивать его символ за символом.

instanceof - это нечто совершенно другое и сообщит вам, является ли объект экземпляром объекта определенного типа, например, "foo" instanceof String isправда.

3 голосов
/ 12 октября 2010

Метод equals() вернет true, если две строки имеют одинаковое значение. Оператор == будет иметь значение true, только если обе строки указывают на один и тот же базовый объект. Следовательно, две строки, представляющие один и тот же контент, гарантированно будут равны при тестировании методом equals(Object); тогда как при тестировании с оператором == это будет верно только для тех, кто ссылается на один и тот же Object. Итак, мы всегда должны использовать equals() для String сравнения.

Ключевое слово instanceof можно использовать для проверки, относится ли объект к указанному типу. Например,

if(foo instanceof Bar) { // must not pass
}

Для получения более подробной информации см. здесь .

0 голосов
/ 12 октября 2010
  • x instanceof ClassName возвращает true тогда и только тогда, когда x является объектом класса ClassName или любого его подкласса

  • x == y работает по-разному для типов значений (char, int, float и т. Д.) И ссылочных типов (Object, Integer, YourClass, int [], ...): для типов значений возвращает true, если x и y - одно и то же значение, тогда как для ссылочных типов возвращается значение true, если x и y обозначают один и тот же объект - для двух объектов с разными значениями результат может быть ложным. Просто относитесь к == для ссылочного типа как к сравнению указателей в C ++ - результат равен true, если целые числа, представляющие указатели, равны, то есть указатели обозначают один и тот же объект. Итак: new String ("abc") == new String ("abc") - false - то же значение, но разные объекты, аналогично "abc" == new String ("abc") - false, но "abc" == «abc» имеет значение true, потому что если константа String появляется много раз в файле .class, она преобразуется в один объект String.

    • x.equals (y) по умолчанию (в Object.equals) реализован так же, как x == y, но многие подклассы переопределяют его, например, для Strings, x.equals (y) проверяет, являются ли эти Strings имеют одинаковое значение, несмотря на то, являются ли они одинаковыми объектами или нет, поэтому: new String ("abc"). equals (new String ("abc")) имеет значение true, а "abc" .equals ("abc") - true

    • однако, если все ваши строки для сравнения были «интернированы», например: x = x.intern (); y = y.intern (), тогда x == y будет работать. Так, например, «abc» == new String («abc»). Intern () дает true.

0 голосов
/ 12 октября 2010

Будет возвращено значение true, если вы определили строку как s = "Компьютер" вместо создания нового объекта.Это потому, что Java хранит строковые литералы в специальном пространстве памяти, поэтому s и строка «Компьютер» будут указывать на одну и ту же область памяти.instanceof - это оператор, который возвращает значение true, если объект левой стороны относится к типу класса, указанному справа.

Например,

String s=""; 
if(s instaceof java.util.String){
   ......
 }

Бит предыдущего кода вернул бы значение true

0 голосов
/ 12 октября 2010

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

Оператор == определяет, идентичны ли два объекта или необработанных типа данных (например, int).

Поскольку строка является объектом, использование == для сравнения двух строк пытается определить, идентичны ли сами объекты, а не являются. Чтобы получить результат «равно А», вам нужно сравнить s с самим собой.

String's .equals() и .equalsIgnoreCase() - это методы, которые сравнивают текстовое значение объекта String, что вы и пытаетесь сделать.

Ключевое слово instanceof используется для обнаружения типа объекта (например, если объект имеет тип String или тип Integer).

...