«===» эквивалент в Java - PullRequest
19 голосов
/ 20 июня 2019

При сравнении двух значений в Java, как вы проверяете, являются ли оба, тип и значение, эквивалентными?

Я знаю, что в JavaScript === может быть использовано для достижения этой цели, поэтому я попробовал этов Java, но это не сработало.

Я знаю, что это простой вопрос, но я попытался найти его и не смог выяснить, что это было.

Ответы [ 9 ]

40 голосов
/ 20 июня 2019

TL; DR

В Java нет такого оператора сравнения: ===, но == или equals

Более подробное объяснение

В слабо типизированных языках, таких как JavaScript, вы можете использовать оператор строгого сравнения (===), поскольку язык позволяет сравнивать переменные, которые имеют различные типы .

Например, в JavaScript вы не получите ошибку компиляции , если вы сделаете это:

var x = 10;
var y = 'foo';
console.log(x == y); // false

И это полезно, когда вы хотите сравнить переменные, которые могут содержать значения, которые являются «равными», но могут быть разных типов.

Например

var x = 10;
var y = '10';
console.log(x == y)  // true
console.log(x === y) // false

В строго типизированных языках, таких как Java, вам не нужно использовать оператор строгого сравнения, потому что язык уже "обрабатывает" сравнение типов.

Например:

int x = 10;
String y = "10";
System.out.println("10" == y); // true
System.out.println(x == y);    // compile error : Incompatible operand types int and String

Так что, в основном, в Java нет необходимости проверять строгость с использованием === (сообщается о синтаксической ошибке ).

Во-первых, компилятор будет жаловаться, когда вы сравниваете значения разных типов, используя оператор == и преобразование не может быть выполнено.

В предыдущем примере кода Java, если вы хотите провести сравнение между x и y, вы можете использовать equals:

int x = 10;
String y = "10";
System.out.println(y.equals(x)); // compile warning: Unlikely argument type for equals(): int seems to be unrelated to String

В качестве примечания обратите внимание, что метод equals нельзя вызывать для примитивных типов.

Некоторые полезные чтения:

5 голосов
/ 23 июня 2019

Я сделал функцию, которая r демонстрирует функциональность === Javascript в Java

static boolean compareData(Object v1, Object v2)
{
    if(v1 != null && v2 != null)
        return (v1.getClass() == v2.getClass() && (v1.toString().equals(v2.toString())));
    else
    {
        return (v1 == null ? v2 == null : v1.equals(v2));
    }
}

Я смог передать значения любого типа данных (кромеarray) для этой функции, а также получить true только в том случае, если тип данных и значения соответствуют , в противном случае возвращается false.Производные типы данных, такие как List и HashMap, также работают .

Вызов этой функции выглядит следующим образом:

float s1 = 0.f;
float s2 = 0.1f;

System.out.println(compareData(s1, s2)); //Returns false

float s1 = 0.0f;
float s2 = 0.0f;

System.out.println(compareData(s1, s2)); //Returns true

float s1 = 0.1f;
String s2 = "0.1f";

System.out.println(compareData(s1, s2)); //Returns false 

String s1 = "sdf";
String s2 = null;

System.out.println(compareData(s1, s2)); //Returns false 

String s1 = null;
String s2 = null;

System.out.println(compareData(s1, s2)); //Returns true

и т. Д. ...

Обновление: I удалось также сравнить массивы , следующий кодфрагмент, но я не тестировал этот код интенсивно, но работал для каждого тестового примера, который я выполнил.

if(s1 != null && s2 != null)
    if(s1.getClass().isArray() && s2.getClass().isArray())
        compareDatab = s1.getClass().equals(s2.getClass()) && (Arrays.toString(s1).equals(Arrays.toString(s2)));
    else
        compareDatab = compareData(s1, s2);
else
    compareDatab = compareData(s1, s2);

Использование приведенного выше фрагмента (Следующие инициализации должны быть выполнены до приведенного выше фрагмента кода, smh: P):

//s1 and s2 can be anything including Arrays and non-Array...
int[] s1 = {1,2,3};
int[] s2 = {1,2,3};
//compareDatab gives true

int[] s1 = {1,2,4};
int[] s2 = {1,2,3};
//compareDatab gives false

float[] s1 = {1,2,3};
int[] s2 = {1,2,3};
//compareDatab gives false

Где compareData () - это та же функция, которая указана ранее в этом ответе.

Надеюсь, это окажется полезным для вас.:)

3 голосов
/ 20 июня 2019

В Java вы можете сравнивать примитивные типы, такие как int, double, char, long, float, используя '=='.В этом случае значения сравниваются.Для сравнения объектов этого недостаточно, поскольку «==» оценивается только как «истина», если идентичности сравниваемых объектов одинаковы - «идентичность» - это адрес памяти, где хранится объект.Это связано с тем, что все классы неявно наследуют все методы, предоставляемые классом «Object», а метод «equals ()» содержит только базовую реализацию.Из-за этого любой класс, чьи объекты участвуют в сравнениях, используются в структурах данных или вне его собственного пакета, должен содержать надежную реализацию метода equals () и hashCode () для обеспечения правильной функциональности.

В отношении следующей реализации:

public class MyClass {

  private final int val;
  private final String name;

  public MyClass(int val, String name) {
     this.val = val;
     this.name = name;
  }

  public int getVal() { return val; }

  public String getName() { return name; }

  public boolean equals(Object o) {
     if(o == null) return false;
     if(this == o) return true;
     if(!this.getClass().getSimpleName().equals(o.getClass().getSimpleName()) return false;

     MyClass other = (MyClass) o;

     return this.getVal() == other.getVal() && this.getName().equals(other.getName());
  }

  public int hashCode() { ... }

}

Также ознакомьтесь с официальным API Java для получения дополнительной информации https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html.

3 голосов
/ 20 июня 2019

=== полезен в языках со слабой типизацией, таких как Javascript, потому что он проверяет, что сравниваемые объекты относятся к одному и тому же типу, и избегает неявных преобразований.

=== абсолютно бесполезен встрого типизированный язык, такой как Java, потому что вы не можете сравнивать переменные разных типов без написания специального метода для этого.

3 голосов
/ 20 июня 2019

В Java нет понятия правдивости и ложности, поэтому нет оператора строгого сравнения.

2 голосов
/ 20 июня 2019

Нет оператора === для сравнения. Если вы хотите сравнить две ссылки, вы должны проверить - 1. Если они указывают на один и тот же объект.

if(firstreference==secondreference) 
  1. Если указанное выше условие 1 не удовлетворяет, вы должны проверить его тип оператором instanceof:
if (secondreference instanctof classoffirstreference)
  1. Если вышеприведенное условие 2 удовлетворяет, вы должны проверить сравнение свойств оператором equals, например
firstreference.property1.equals(secondreference.property1)
//do this for all properties.
2 голосов
/ 20 июня 2019

Если две переменные не одного типа, вы не можете их сравнивать, поэтому в этом случае == будет достаточно. Если они не конвертируемы, это приведет к ошибке компилятора.

1 голос
/ 01 июля 2019

Я не вижу никакой выгоды в написании собственного компаратора для этого.особенно если для этого уже есть нативная реализация.

java.util.Objects - ваш друг.

Он содержит много небольшого помощника, например

Objects.compare(object1, object2, comparator);
Objects.equals(object1, object2);
Objects.deepEquals(object1, object2);
Objects.hash(object1, object2, object3, ...);

Я использую Objects.equals при перезаписи в equals и Objects.hash в методах hashCode.Он также выполняет нулевые проверки для вас, и в конце код выглядит очень чистым и читаемым.

Например:

...

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof Customer)) {
        return false;
    }
    Customer that = (Customer) o;
    return Objects.equals(firstName, that.firstName)
            && Objects.equals(lastName, that.lastName)
            && Objects.equals(street, that.street)
            && Objects.equals(houseNumber, that.houseNumber)
            && Objects.equals(postalCode, that.postalCode)
            && Objects.equals(city, that.city)
            && Objects.equals(emailAddress, that.emailAddress);
}

@Override
public int hashCode() {
    return Objects.hash(firstName,
            lastName,
            street,
            houseNumber,
            postalCode,
            city,
            emailAddress);
}

...
1 голос
/ 24 июня 2019

Если мы сравним две переменные в JS, мы можем использовать "==" и "===" обе. "==" сравнить значения и "===" сравнить типы.

var x = 10;
var y = '10';
console.log(x == y)  // true
console.log(x === y) // false

и в Java это дает вам ошибку компиляции, потому что тип не тот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...