2013-02-27 137 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))可靠地去除对象

相关问题