2015-04-27 146 views
0

targetPixValList是一個包含Double對象的列表,它在列表中的連續位置也包含類似的值,當我試圖使用Code_1比較兩個Double值時,cnt返回零。 當我使用code_2時,cnt返回值。爲什麼「==」運算符不起作用

和列表的類型是

爲什麼「==」操作不帶雙工作?

Code_1:

int cnt = 0; 
    for (int i = 0; i < cs.targetPixValList.size()-1; i++) { 
     if (cs.targetPixValList.get(i) == cs.targetPixValList.get(i+1)) 
      ++cnt; 
    } 

CODE_2:

int cnt = 0; 
    for (int i = 0; i < cs.targetPixValList.size()-1; i++) { 
     if (cs.targetPixValList.get(i).equals(cs.targetPixValList.get(i+1))) 
      ++cnt; 
    } 
+4

不要使用''==來比較對象,使用'.equals(對象)'代替。 – JonK

+0

「targetPixValList」的類型是什麼? – erencan

+1

@erencan'Double' - 它在問題 – JonK

回答

1

比較對象時使用.equals(otherObject)。你在比較Double這是一個對象。如果您使用的是double而不是原語,則可以使用==來比較值。

另外,從Double對象得到double值:

if (yourDoubleObject.doubleValue() == otherDoubleObject.doubleValue()) { 
    // Do some things 
} 
7

Double是一類包裝器原語double。當比較Double(或對象引用)的實例時,使用equals方法而不是==

此外,對於您的情況,使用equalsDouble的比較也可能由於浮點比較(在幕後完成)而給出錯誤結果。如果您使用的是敏感浮點值,我推薦使用BigDecimal而不是Double並使用BigDecimal#compareTo而不是equals,因爲BigDecimal#equals不考慮scale,而BigDecimal#compareTo

+0

我認爲如果我們只是在做「比較」,那麼「equals」方法的Double應該足夠了。 但是,如果算術運算如Add,divide等正在執行,那麼我們需要:1.將Double轉換爲大十進制,2.指定用於處理溢出場景的「舍入」機制if任何。 – Mecon

+0

@Mecon在使用BigDecimal時,最好使用BigDecimal#compareTo(anotherBigDecimal)== 0'而不是使用'BigDecimal#equals',因爲'equals'不考慮比例尺,而'compare'。這是JDK中「equals」和「compare」方法不一致的奇怪情況之一。 –

0

==運營商給出了基本類型正確的結果一樣intlongdouble。如果你使用帶有對象的操作符,它將默認地比較引用。

使用equals方法可能會根據對象給出正確的結果。您應該重寫equals方法以邏輯檢查對象是否相等。

對於Double對象,它還檢查對象的參照等價性。您應該使用Double#doubleValue方法來檢查值等價。

這是代碼;

for (int i = 0; i < cs.targetPixValList.size()-1; i++) { 
     if (cs.targetPixValList.get(i).doubleValue() == cs.targetPixValList.get(i+1).doubleValue()) 
      ++cnt; 
    } 

參見:

How to override equals and hashcode