2012-02-15 55 views
1

比方说,你有两个列表声明:为什么要为Java ArrayList的remove方法分配一个变量,会产生什么后果?

ArrayList listA = new ArrayList(); 
ArrayList<Book> listB = new ArrayList<Book>(); 

然后你有这些语句:

Object obj = listA.remove(2); 
Book bk = listB.remove(2); 
String str = listA.remove(1); 

假设有在每个指定地点的对象,为什么你要分配这些变量的方法,以及它的后果是什么?我已经三次阅读本章,但我仍然不明白这一点。我错过了什么?

回答

2

纵观三句话:

第一个Object obj = listA.remove(2)使用原始类型。该定义包含Object。一切都从Object继承,所以它可以保存任何东西。这可能会导致问题。看看这个post看看为什么这是不可取的。

第二个是强类型。您只能删除项目并将其分配给定义中的类型(在ArrayList<Book>中,它必须与Book匹配)。这是java编译器检查类型的一种方法,以确保您使用的是所有相同的类型。如果你不匹配,我相信这是一个编译器错误。

第三个演示为什么第一个项目是一个问题。阅读post,它会告诉你为什么。

+0

你把一只猫咪放进去,当你想把它拿出来时,它是......一个物体。郁闷:-( – wmz 2012-02-16 00:01:09

+0

呵呵,我明白了,当你试图将被删除的项目赋给一个不同类型的变量时,会出现编译错误,我以前怎么没有意识到这一点? – helloimbarbara 2012-02-16 00:11:09

0

当ArrayList使用#remove(Object obj)方法时,如果成功删除,则返回true;如果未删除,则返回false。

编辑:刚才注意到我在那里使用了Object参数。除了索引参数方法之外,它还返回被删除的值。

这可以用于从1列表转移到另一个列表,或者有时甚至在递归方法中。

+2

[This is not correct](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html#remove \(int \)) – 2012-02-15 23:40:24

+0

我以为删除函数返回在该位置被删除的项目。 – helloimbarbara 2012-02-15 23:41:00

+0

哦,不要忘了,我只注意到@Banthars的回应。 – helloimbarbara 2012-02-15 23:41:32

3

remove(int)方法从列表中删除一个对象并返回被删除的对象。删除对象与删除对象不一样......你可能有一个用例,你想删除一个对象,但仍然想用它做些事情。如果你真的不希望对象是删除后,就是不给它分配,如

list.remove(3) 

这将删除对象的偏移量(3)和不保留对它的引用。如果没有其他参考,它最终会被垃圾收集。

相关问题