如果我有一个名为foo的静态ArrayList,它持有名为ServerThread的对象,我是否可以调用
foo.remove(this)
从ServerThread实例中删除自己的ArrayList?
答案 0 :(得分:2)
是的,这就是ArrayList#remove(和List#remove
一般)的用途。请确保如果您将此列表与多个线程共享,则可以执行任何适当的锁定/同步,以确保在另一个线程中对其进行迭代时不会对其进行修改等。
正如Woot4Moo在评论中指出的那样,ArrayList
可能不是理想的选择,如果你做了很多删除。您可以考虑LinkedList
。
答案 1 :(得分:1)
是。如果您查看ArrayList#remove(Object)
的源代码,您会看到它使用equals
。更一般地说,这正是您使用ArrayList#remove(Object)
的原因;删除对象的特定实例(如果它存在于列表中)。
您使用列表的方式有点令人担忧。如果从多个线程进行操作,您可能希望确保保护对列表的访问。
正如评论中所指出的,如果你做了很多删除,你可能不想使用ArrayList
。这是因为总体来说它是O(n)
操作,因为您必须在支持ArrayList
的数组中找到所需的元素,然后将所有其他元素向上移动。但是对于LinkedList
,您只需找到元素(在最坏的情况下可以是O(n)
,但大多数情况下都不应该这样做。)
答案 2 :(得分:0)
是的,为什么不呢。我猜你的怀疑是因为看起来线程是通过删除对自身的引用来“自杀”。但是当将'this'作为函数参数传递时没有特殊的行为......它只是列表中的一个对象,就像其他任何对象一样。