添加对象时,Java ArrayList的大小变得非常大

时间:2016-10-02 17:37:38

标签: java arraylist iterator size

当我将Entity对象添加到我的ArrayList(这里称为实体)时,我遇到了问题。每个Entity对象都有一个长ID,int x-position和y-position

首先,我检查列表是否为空,它应该在开始时。如果我添加第二个Entity-object,我会检查对象的id是否存在,如果是,则更新Entity-object的位置。如果该对象不存在,则应添加该对象。

我的问题是ArrayList的大小变得很大,我不知道如何修复它。

以下所有代码都位于连续运行的update()方法中。

 /**
  * Method that checks if the entity exist or not.
  * @param ent - The Entity that should be updated or added.
  */
 public void checkEntity(Entity ent){
   if(entities.isEmpty()){
     entities.add(ent);
   }
   else{
     for(ListIterator<Entity> li = entities.listIterator(); li.hasNext();){
       Entity next = li.next();
     if(next.getID() == ent.getID()){
//     System.out.println("id: " + next.getID() + " xPos: " + next.getXPos() + " yPos: " + next.getYPos() + " type: " + next.getType());
       next.setXPos(xPos);
       next.setYPos(yPos);

     }
     else{
       li.add(ent);
     }
     System.out.println(entities.size());
   }
 }

1 个答案:

答案 0 :(得分:3)

问题是,每当您找到不具有相同ID的条目时,您都会在列表中添加新条目 ...您的add来电是< em> inside 你的循环,它不应该是。

基本上,你应该有类似的东西:

public void checkEntity(Entity entity) {
    for (Entity candidate : entities) {
        if (candidate.getID() == entity.getID()) {
            candidate.setXPos(entity.getXPos());
            candidate.setYPos(entity.getYPos());
            // Found a matching entity, so we're done now.
            // This is important, so we don't add the entity again.
            return;
        }
    }
    // Haven't found it, so add it to the list
    entities.add(entity);
}

请注意,如果添加大量实体,效率会非常低。从实体ID到实体的映射效率要高得多......那么您不需要每次检查每个实体