2013-02-27 55 views
5

當我在Java中使用ArrayList時,有一些東西我不明白。這裏是我的初始化代碼:ArrayList <Integer>使用get/remove方法

ArrayList<Integer> list = new ArrayList <Integer>(); 
list.add (0); 
list.add (1); 

有時我需要通過其索引中刪除對象:

list.remove (0) // delete the object in the first box 

但有時我想它的內容刪除對象:

list.remove (0) // delete the object HAS Which value of 0 

這段代碼非常含糊。爲了澄清什麼,我想這樣做在代碼中,我指定這樣的類型:

list.remove ((Object) 0) // delete the object which has a value of 0 

如果我不交,知道哪些方法被調用的唯一方法就是把鼠標指針的方法請參閱: java.util.ArrayList.remove布爾值(對象對象)

Java但它是如何區別的? 有沒有方法指針? 有沒有一個不太模糊的方法來做到這一點?

非常感謝你,對不起我的英文。

PS:我應該說,我終於用SparseIntArray但我好奇地

回答

8

對於本州。 List#remove(index)返回從列表中移除的Object。 List#remove(Object)返回一個布爾值。

然而在這種特殊情況下。你可以做。

ArrayList<Integer> list = new ArrayList <Integer>(); 
     list.add (0); 
     list.add (1); 
     System.out.println(list.remove(new Integer(0))); 
+0

是的,我注意到了這一點。但如果我不使用返回值,我想知道Java如何產生影響,以及自動裝箱如何工作。 – 2013-02-27 16:42:22

+0

@ juliendumortier在這種特殊情況下,這只是令人困惑。但是如果你在對象的情況下一般考慮它就好。 'list.remove(動物)'或'list.remove(watever)'。 – PermGenError 2013-02-27 16:43:54

+0

好的,謝謝!最後一個問題。 System.out.println(list。刪除((Integer)0); 這是一個好的/不好的做法? (這避免了創建一個新的實例)。 – 2013-02-27 16:55:47

2

每當有Java中的歧義(當多個方法簽名可以匹配在編譯時參數類型的),使用強制轉換到選擇正確的方法是你唯一的選擇。當然,在實際調用之前,您可以將參數轉換爲局部變量,但這並不能讓讀者更清楚 - 在使用它的地方直接轉換參數是最佳選擇,在我看來,要明確哪種方法叫做。

順便說一句,在這種情況下,API是如此具有模糊性的原因是,在製作API時,沒有自動裝箱,所以不可能在第一個地方編寫模糊的代碼。然而,改變方法使其明確無疑將是一個突破性的改變。由於在大多數情況下將Integer存儲在數組列表中並不是一個好主意,所以他們決定讓我們忍受這種輕微的煩惱。

1

如果只是模糊與整數ArrayList中remove()方法是困擾着你,你可以擴展的ArrayList實現自己:

public class MyIntArrayList extends ArrayList<Integer> { 

    boolean removeByObject(Integer intObj) { 
     return super.remove(intObj); 
    } 

    Integer removeByIndex(int index) { 
     return super.remove(index); 
    } 

} 
0

你可以使用list.remove(new Integer(0))可靠地去除對象

相關問題