[英]Question about arrays in Java
有人可以解釋為什么A.equals(B)
是false
,當我發起B
用int[] B = A.clone()
但true
要是我發起B
用int[] B = A
?
int[] A = {1, 2, 3, 4, 5};
int[] B = A;
//int[] B = A.clone();
if(A==B){//true
System.out.println("Equal");
}
if(A.equals(B)){//true
System.out.println("Equal");
}
顯然,Java中數組的equals
方法是比較引用相等(與==
相同)。
如果你克隆它,你有一個引用不同的對象 - 克隆數組。 但是,如果你只是指向它的另一個引用它是相同的。
好吧,如果你使用
int[] B = A;
那么B
和A
指的是同一個對象,所以它們是平等的。 第一個比較(==) 肯定會在A
和A.clone()
之間返回false,因為值指的是不同的對象。 聽起來數組不會覆蓋equals
(例如,像ArrayList
那樣),因此克隆不等於equals
方法下的原始。
編輯:的確,從語言規范部分10.7,數組成員 :
所有成員都繼承自Object類; 唯一沒有繼承的Object方法是它的clone方法。
換句話說,數組覆蓋clone()
但不覆蓋toString
/ hashCode
/ equals
。
要比較Java中的數組,您可能想嘗試一下
java.util.Arrays.equals(a,b);
如果你使用a == b
它們應該是不同的 - 這比較它們的內存引用。
如果你使用a.equals(b)
,它可能繼承自Object,它只使用==
。
這可能解釋了為什么他們首先制作了Arrays.equals()。 現在為什么他們選擇a.equals(b)來不比較元素......很難說。
你的問題由克隆()的Javadoc精確回答:
http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29
特別:
[clone()方法]創建並返回此對象的副本。 “復制”的確切含義可能取決於對象的類別。 一般意圖是,對於任何對象x,表達式:
x.clone() != x
將是真的,那表達式:
x.clone().getClass() == x.getClass()
將是真的,但這些並非絕對要求。 通常情況是:
x.clone().equals(x)
將是真的, 這不是絕對的要求 。
int[] B = A;
使B
指向內存中與A
相同的對象,因此它們不僅相同,而且相同。
如果指定B = A,則將引用分配給同一對象。 使用clone(),您將獲得該對象的副本。 等於運算符(==)測試兩個符號是否引用相同的對象,其中.equals方法檢查兩個對象是否具有相同的值(由類的實現定義)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.