В чем разница между Python и оператором Java == - PullRequest
3 голосов
/ 25 октября 2019

Может кто-нибудь объяснить мне, почему Python может напечатать следующее утверждение, а Java - нет. Я знаю, что это как-то связано с == в Java и равно (), но я не совсем понимаю разницу.

Python-код

str1 = "Pro"
str2 = str1 + ""

if str1 == str2:
   print("the strings are equal")```

Java-код

public class StringEq {
    public static void main(String[] args) {
        String str1 = "Pro";
        String str2 = str1 + "";

       if (str1 == str2) {
            System.out.println("The strings are equal");
        }
     }
 }

Ответы [ 3 ]

3 голосов
/ 25 октября 2019

Класс Python str использует равенство значений для своего метода __eq__. В Python классы могут переопределить __eq__, чтобы определить поведение ==.

Сравните это с Java, где == всегда выполняет равенство ссылок. В Java == вернет true, только если оба объекта в буквальном смысле являются одним и тем же объектом;независимо от их содержания. == в Java более сопоставим с оператором is в Python.

Лучшее сравнение, как отмечено в комментариях, было бы сравнить эти:

"a".equals("a")  // Java

"a" == "a"  # Python

Класс Java String имеет equals равенство значений вместо ссылочного равенства.

1 голос
/ 25 октября 2019

Это хорошо объясняет здесь :

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

1 голос
/ 25 октября 2019

В python == используется для сравнения содержимого объектов путем переопределения оператора . eq (a, b) , класс str переопределил это вДля сравнения содержимого объектов

These are the so-called “rich comparison” methods. The correspondence 
between operator symbols and method names is as follows: x<y calls 
x.__lt__(y), x<=y calls x.__le__(y), x==y calls x.__eq__(y), x!=y calls 
x.__ne__(y), x>y calls x.__gt__(y), and x>=y calls x.__ge__(y).

Но в java == используется оператор сравнения ссылок объектов здесь

Использование «== »Оператор для сравнения текстовых значений является одной из наиболее распространенных ошибок, которые допускают новички в Java. Это неверно, поскольку «==» проверяет только ссылочное равенство двух строк, то есть, ссылаются ли они на один и тот же объект.

, поэтому в java для сравнения содержимого объекта вы должны использовать equals, который переопределяется в String классе.

if (str1.equals(str2))

, поэтому оператор java == равен оператору is в python, который сравнивает обе ссылки на один и тот же объект или нет

...