arraylist删除消除了以下对象

时间:2013-11-25 20:03:23

标签: java arraylist

我的代码中有一个非常奇怪的动作。我有以下课程的ArrayList

class mySocket 
{
    public String name;
    public Socket sck;
    public mySocket(String n,Socket s)
    {
        this.name=n;
        this.sck=s;
    }
}

我声明像这样的对象

ArrayList<mySocket> handler = new ArrayList<>();

现在的问题是,当我尝试使用此方法删除项目时:

public void removeByName(String name)
{
    synchronized(this)
    {
        mySocket t;
        int i;
        for(i=0;i<handler.size();i++)
        {
            t=handler.get(i);
            if((t.name.equals(name)))
            {
               handler.remove(i);
               break;
            }
        }
    }
}

删除功能会清除索引后面的所有内容   例如:
如果此ArrayList有3个元素并且我调用handler.remove(1),它不仅会删除1,还会删除第2行上的对象。

2 个答案:

答案 0 :(得分:0)

我认为您的问题是您正在使用索引for循环并按索引删除。在您的示例中,如果您的列表包含3个元素并且您删除索引1,则索引2处 的对象仍然存在。它刚刚在索引1处。

更好的方法是尝试使用迭代器或for-each循环。

//code outside for loop the same
for( mySocket socket : handler ) {

    if((socket.name.equals(name)))
    {
       handler.remove(socket);
       break;
    }
}

mySocket个对象的排序是否重要?如果没有,将它们存储在Map按名称键入将为您省去一些麻烦。然后你只需拨打handler.remove(name)。即使地图中不存在name,此操作也是安全的。此外,对于不关心名称的集合handler的当前使用,您可以通过调用Set来检索mySocket的无序map.values()。然后,您可以使用迭代器或上面的for-each迭代Set

答案 1 :(得分:0)

在循环播放时,您无法删除集合中的项目,结果如您所见,未定义。

您必须构建要删除的项目列表并使用

originalList.removeAll(itemsToBeRemoved);

或者使用迭代器构建循环。

Iterator<mySocket> handlerIterator = handler.iterator();

while (handlerIterator.hasNext()) {
  mySocket t = handlerIterator.next();
  if (t.name.equals(name)) {
    handlerIterator.remove();
  }
}