В чем разница между «.equals» и «==»?

Сегодня я переключил преподавателей, и он сказал, используя мне странный код. (Он сказал, что лучше использовать .equals и когда я спросил, почему, он ответил «потому что это!»)

Итак, вот пример:

 if (o1.equals(o2)) { System.out.println("Both integer objects are the same"); } 

Вместо того, к чему я привык:

 if (o1 == o2) { System.out.println("Both integer objects are the same"); } 

В чем разница между ними. И почему его способ (с использованием .equals ) лучше?

Нашел это при быстром поиске, но я не могу понять этот ответ:

В Java == всегда просто сравнивается две ссылки (для не-примитивов, то есть), то есть она проверяет, ссылаются ли эти два операнда на один и тот же объект.

Однако метод equals можно переопределить, поэтому два разных объекта могут быть равны.

Например:

 String x = "hello"; String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' }); System.out.println(x == y); // false System.out.println(x.equals(y)); // true 

Кроме того, стоит знать, что любые две равные строковые константы (в первую очередь строковые литералы, а также комбинации строковых констант посредством конкатенации) будут ссылаться на одну и ту же строку. Например:

 String x = "hello"; String y = "he" + "llo"; System.out.println(x == y); // true! 

Здесь x и y являются ссылками на одну и ту же строку, так как y является константой времени компиляции, равной "hello" .

Оператор == сравнивает, являются ли объекты одним и тем же экземпляром . Параметр equals () oerator сравнивает состояние объектов (например, если все атрибуты равны). Вы можете даже переопределить метод equals (), чтобы определить себя, когда объект равен другому.

Если вы и я каждый входим в банк, каждый открывает новый счет, и каждый депозит 100 долларов, затем …

  1. myAccount.equals(yourAccount) true потому что они имеют одинаковое значение , но
  2. myAccount == yourAccount является false потому что это не та же учетная запись .

(Предполагая соответствующие определения classа Account , конечно. 😉

== – оператор. equals – это метод, определенный в classе Object

== проверяет, имеют ли два объекта один и тот же адрес в памяти, а для примитива он проверяет, имеет ли они тот же метод value.equals, с другой стороны, проверяет, имеют ли два сравниваемых объекта одинаковое значение (в зависимости от того, метод equals реализован для объектов. Метод equals не может быть применен к примитивам (это означает, что если a является примитивным a.equals (некоторым объектом), недопустимо, однако допускается некоторый объект. aequals (a)).

== оператор сравнивает две ссылки на объекты, чтобы проверить, относятся ли они к одному экземпляру. Это также вернет true при успешном матче. Например

 public class Example{ public static void main(String[] args){ String s1 = "Java"; String s2 = "Java"; String s3 = new string ("Java"); test(Sl == s2) //true test(s1 == s3) //false }} 

выше пример == является эталонным сравнением, т.е. оба объекта указывают на одно и то же место памяти

String equals () оценивает сравнение значений в объектах.

  public class EqualsExample1{ public static void main(String args[]){ String s = "Hell"; String s1 =new string( "Hello"); String s2 =new string( "Hello"); s1.equals(s2); //true s.equals(s1) ; //false }} 

выше пример. Он сравнивает содержимое строк. Он вернет true, если строки совпадают, иначе возвращает false.

В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. EX:

 String obj1 = new String("xyz"); String obj2 = new String("xyz"); if(obj1 == obj2) System.out.println("obj1==obj2 is TRUE"); else System.out.println("obj1==obj2 is FALSE"); 

Несмотря на то, что строки имеют одинаковые точные символы («xyz»), приведенный выше код действительно выводит: obj1 == obj2 is FALSE

Класс Java String фактически переопределяет реализацию equals () по умолчанию по умолчанию в classе Object – и переопределяет метод таким образом, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.

 String obj1 = new String("xyz"); String obj2 = new String("xyz"); if(obj1.equals(obj2)) System.out.printlln("obj1==obj2 is TRUE"); else System.out.println("obj1==obj2 is FALSE"); 

Этот код выводит следующее:

obj1 == obj2 – ИСТИНА

 public static void main(String[] args){ String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1.equals(s2)); //// System.out.println(s1 == s2); System.out.println("-----------------------------"); String s3 = "hello"; String s4 = "hello"; System.out.println(s3.equals(s4)); //// System.out.println(s3 == s4); } 

Здесь, в этом коде, вы можете поставить в лапы оба «==» и «.equals»,

здесь .equals используется для сравнения ссылочных объектов, а ‘==’ используется для сравнения состояния объектов.

(1) == может применяться как для примитивов, так и для типов объектов, но метод equals () может применяться только для типов объектов.

(2) == нельзя переопределить для сравнения содержимого, но метод equals может быть переопределен для сравнения содержимого (например, class String, classы-оболочки, classы коллекции).

(3) == дает ошибку несравнимых типов при попытке применить к гетерогенным типам, когда метод equals возвращает false.

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

 // equals() vs == class EqualsNotEqualTo { public static void main(String args[]) { String s1 = "Hello"; String s2 = new String(s1); System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2)); } } 

Переменная s1 ссылается на экземпляр String, созданный “Hello” . Объект, на который ссылается s2 , создается с помощью s1 в качестве инициализатора. Таким образом, содержимое двух объектов String идентично, но они представляют собой различные объекты. Это означает, что s1 и s2 не относятся к одним и тем же объектам и поэтому не относятся к == , как показано здесь на выходе предыдущего примера:

 Hello equals Hello -> true Hello == Hello -> false 

Допустим, что оператор «==» возвращает true, если оба обоих операнда принадлежат одному и тому же объекту, но когда он вернет true, поскольку мы не можем присвоить одному объекту несколько значений

 public static void main(String [] args){ String s1 = "Hello"; String s1 = "Hello"; // This is not possible to assign multiple values to single object if(s1 == s1){ // Now this retruns true } } 

Теперь, когда это происходит практически, если это не так, то почему это == сравнивает функциональность ….

Вот простая интерпретация вашей проблемы:

== (равный), используемый для оценки арифметического выражения

в то время как

Метод equals (), используемый для сравнения строки

Поэтому лучше использовать == для числовых операций & equals () для операций со строками. Таким образом, для сравнения объектов метод equals () был бы правильным выбором.

  • Как реализовать метод hashCode и equals
  • Есть ли полная ссылка на реализацию IEquatable?
  • Почему мне нужно переопределить методы equals и hashCode в Java?
  • Любые причины, чтобы предпочесть getClass () над instanceof при генерации .equals ()?
  • Это плохая идея, если equals (null) вместо NullPointerException выбрасывает?
  • Как следует использовать равенства и hash-код при использовании JPA и Hibernate
  • Почему мы не можем использовать '==' для сравнения двух чисел с плавающей запятой или двойных чисел
  • Лучшая реализация для метода hashCode
  • Разница между пустой и пустой ("") строкой Java
  • Почему эти ==, но не `equals ()`?
  • Есть ли утилита отражения Java для глубокого сравнения двух объектов?
  • Interesting Posts

    Почему мое правило Outlook 2007 не может быть серверным при использовании правила «Отметить как прочитанное»

    Почему вызовы метода интерфейса медленнее, чем конкретные вызовы?

    Тип не имеет члена

    Чтение свойств пакета ресурсов в управляемом компоненте

    Как отправить полезную нагрузку запроса на API REST в java?

    Лучшее программное обеспечение для резервного копирования (и, возможно, обновления)

    Экран заставки до тех пор, пока нить не закончится

    Как вы можете использовать рецепт шеф-повара для установки переменной окружения?

    Как разделить матричные элементы на суммы столбцов в MATLAB?

    Заполнить базу данных Android из файла CSV?

    Как интегрировать codeIgniter с netbeans полностью

    Обновление Force GUI из UI Thread

    «Новое» ключевое слово в Scala

    Не удается установить диск раздела Windows 8 на Ubuntu 12.10

    Как определить, что вызывает повторный автозапуск установщика Windows?

    Давайте будем гением компьютера.