2010-10-12 2 views
0
String s=new String("Computer"); 
if(s=="Computer") 
    System.out.print("equals A"); 
if(s.equals("Computer")) 
    System.out.print("Equal B"); 

Выход Equal Bразница между ==, равна() и InstanceOf()

Теперь почему == оленья кожа производства equals A

что такое instanceof?

+0

возможно дубликат [Java String.equals против ==] (http://stackoverflow.com/questions/767372/java-string-equals-versus) – Thilo

+0

@Thilo: Случай инстанцировании Я считаю, что 'String' с использованием' new' не существует. –

+0

Дополнительная информация: http://stackoverflow.com/questions/2009228/strings-are-objects-in-java-so-why-dont-we-use-new-to-create-them http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression-new-string-in-java http://stackoverflow.com/questions/456575/java-wrapper-equality-test – Thilo

ответ

3

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

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

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

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

+0

благодаря его действительно хорошему и им очень ясно сейчас! – Sumithra

+0

@Sumithra: Мое удовольствие, Сумитра –

+1

@ Сумитра, если вам нравится ответ, нажмите стрелку вверх рядом с ней. Если вы считаете, что это правильный/правильный ответ, пожалуйста, нажмите галочку. –

5

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

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

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

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

0

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

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

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

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

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

0

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

E.g.

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

Превышение бит кода вернет true.

0
  • х InstanceOf ИмяКласса возвращает истину, если, и только если х является объект класса ClassName или любой подкласс этого

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

    • x.equals (у) по умолчанию (в Object.equals) реализован только при х == у, но много подклассов переопределить его, например, для струнных, x.equals (у) проверки, если таковые Строки имеют одинаковое значение, несмотря на то, что они одинаковые или нет, поэтому: новый String («abc»). Equals (new String («abc»)) истинно, а «abc» .equals («abc») true

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

Смежные вопросы