2017-06-23 54 views
-3

據我的理解,下面的代碼應該打印true,因爲這兩個元素都是equalArray.equal()給出錯誤的輸出

從Java文檔Array.get()將返回:

返回指定數組 對象中索引組件的值。如果該對象具有基本類型 ,則該值將自動包裝在對象中。

然而,當我運行下面的代碼是打印 false

public class Test1 { 

    static boolean equalTest(Object array1, Object array2) { 
     return Array.get(array1, 0).equals(Array.get(array2, 0)); 
    } 

    public static void main(String[] args) { 
     int[] a = new int[1]; 
     byte[] b = new byte[1]; 
     a[0] = 3; 
     b[0] = 3; 
     System.out.println(equalTest(a, b)); 
    } 
} 

我的問題是不執行數類是或者應該是直接的可比性彼此。

+0

它們不是同一類型? 'int!= byte' – TryingToImprove

+1

數據類型不匹配 – Akshay

+0

imho它應該打印爲false,因爲它們不是相同的類型。 –

回答

11

這與數組真的沒有任何關係。您的比較等同於:

Object x = Integer.valueOf(3); 
Object y = Byte.valueOf((byte) 3); 
boolean equal = x.equals(y); 

那永遠不會返回true

即使你的原始數組是原始類型,Array.get返回Object,所以你得到盒裝類型 - 並比較這些不同類型的值。

+0

我很好奇,是否有清晰的價值? – JoshuaTree

+1

@JoshuaTree:「清晰」是什麼意思?它完全有效 - 它是字節3(以字節形式)。 –

+0

@JonSkeet --- SIR非常感謝.... :)你的回答正好對目標進行了轟炸...... :) –

0

數組數據類型不匹配。一個是int,另一個是byte。由於它們以Objects的形式傳遞給函數,因此它們最終會變成IntegerByte。所以爲了正確比較它們,你需要將它們轉換爲相同的類型。例如:

static boolean equalTest(Object array1, Object array2) { 
    int int1 = (int) Array.get(array1, 0); 
    int int2 = (int) Array.get(array2, 0); 
    return int1.equals(int2); 
    // OR return int1 == int2; 
} 
+1

嗯,它們不是'int'和'byte',因爲'Array.get'返回'Object' - 它們會是包裝類型。 (但是,是的,這是因爲類型不一樣)。 –

+0

Jon Skeet和我同意。那麼我們都必須是對的。 :D @jonskeet – Vucko

+0

誠然,但是自動裝箱應該照顧它。 – sorayadragon

0

的問題是,Array.get()方法返回一個對象,所以int它會返回Integer,併爲byte,它將返回Byte。所以.equals()方法將返回false,因爲它首先看到類型是否相同,然後比較值。

1

Array.get調用返回IntegerByte對象實例。根據Integer.equals,這些不相等,因爲類的類型不同。

2

根據documentationArray.get(Object array,int index)方法,如果返回值具有基本類型,則會自動將其返回的值包裝在對象中。所以,如果你加入下面幾行:

System.out.println(Array.get(array1, 0).getClass()); 
System.out.println(Array.get(array2, 0).getClass()); 

你會看到輸出

class java.lang.Integer 
class java.lang.Byte 

Integer類首先檢查的equals方法,如果它被比較的對象也是一個Integer的實例,如果不是,則不需要進一步檢查,它們不相等。 這就是你看到輸出錯誤的原因,因爲被比較的對象是相等的是IntegerByte

0

如果你看一下Java文檔Array.get你會看到:

值會自動包裝在一個對象,如果它有一個基本 類型。

所以你byte小號成爲Byte S和您的int小號成爲Integer秒。

這意味着你調用該函數是Integer.equals(Object)

實現此方法,像這樣:

public boolean equals(Object obj) { 
    if (obj instanceof Integer) { 
     return value == ((Integer)obj).intValue(); 
    } 
    return false; 
} 

你不是傳遞一個Integer,你傳遞一個Byte所以這就是爲什麼它返回false。