簡體   English   中英

“===”相當於Java

[英]“===” equivalent in Java

在比較Java中的兩個值時,如何測試類型和值是否相等?

我知道在JavaScript中===可以用來完成這個,所以我在Java中嘗試過,但它沒有用。

我知道這是一個簡單的問題,但我嘗試查找它,但我無法找出它是什么。

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代碼示例中,如果要在xy之間進行比較,可以使用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方法。

一些有用的讀物​​是:

我創建了一個函數,它在Java中提出了Javascript ===的功能

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));
    }
}

我能夠將任何數據類型(數組除外)的值傳遞給此函數,並且只有在數據類型和值匹配時才會返回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

等等...

更新:我還設法比較了數組 ,以下是代碼片段,但是,我沒有密集地測試這個代碼,但是對我執行的每個測試用例都有效。

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()與本答案中前面所述的功能相同

希望這證明對你有用。 :)

Java中沒有truthy和falsy的概念,因此沒有嚴格的比較運算符。

===在弱類型語言中很有用,例如Javascript,因為它驗證被比較的對象是相同的類型並避免隱式轉換。

===在Java等強類型語言中絕對沒用,因為如果不編寫特定的方法,就無法比較不同類型的變量。

在Java中,您可以使用'=='比較基本類型,如int,double,char,long,float。 在這種情況下,比較值。 對於對象的比較,這是不夠的,因為如果比較對象的標識相同,'=='僅評估為'true' - 'identity'是存儲對象的內存地址。 這是因為所有類都隱式地繼承了'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() { ... }

}

另請參閱官方Java API以獲取更多信息https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

如果兩個變量的類型不同,則無法比較它們,因此在這種情況下==就足夠了。 如果它們不可轉換,則會拋出編譯器錯誤。

沒有===運算符用於比較。 如果要比較兩個引用,則應檢查 - 1.如果它們指向同一個對象。

if(firstreference==secondreference) 
  1. 如果上面的條件1不符合,那么你應該通過instanceof運算符檢查它們的類型:
if (secondreference instanctof classoffirstreference)
  1. 如果上面的條件2滿足,那么你應該通過等於運算符來檢查屬性比較
firstreference.property1.equals(secondreference.property1)
//do this for all properties.

我沒有看到為此編寫自己的比較器的任何好處。 特別是如果已經存在本機實現。

java.util.Objects是你的朋友。

它包含很多小幫手,就像

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

我使用Objects.equals覆蓋equals,並在hashCode方法中使用Objects.hash。 它還為您執行空檢查,最后代碼看起來非常干凈和可讀。

例如:

...

@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);
}

...

如果我們比較JS中的兩個變量,我們可以使用“==”和“===”。 “==”比較值和“===”比較類型。

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

在Java中,這會給你編譯錯誤,因為類型不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM