将元素添加到Arraylist并替换Java中的所有先前元素

时间:2010-03-15 14:48:14

标签: java arraylist

我正在向ArrayList添加元素,它正确地添加了第一个元素,但是当我添加任何后续元素时,它擦除了使用最近添加的值替换其他元素并向ArrayList添加新元素。

我使用arraylist和int运行测试,甚至是另一个创建的类,它运行得很好但是我在这里使用的自定义类会导致问题。

数组列表的代码是

public static void main(String args[]){
   List<BasicEvent> list = new ArrayList<BasicEvent>();
   list.add(new BasicEvent("Basic", "Door", 9, 4444, new Date(12,04,2010), new Time(12,04,21), 1, 0.98, 0));
   list.add(new BasicEvent("Composite", "Door", 125, 4444, new Date(12,04,2010), new Time(12,04,20), 1, 0.98, 1));
   list.add(new BasicEvent("Basic", "Door", 105, 88, new Date(12,04,2010), new Time(12,05,23), 1, 0.98, 0));
   list.add(new BasicEvent("Basic", "Door", 125, 12, new Date(12,04,2010), new Time(12,05,28), 1, 0.98, 1));
   list.add(new BasicEvent("Basic", "Door", 129, 25, new Date(12,04,2010), new Time(12,05,30), 1, 0.98, 0));
   list.add(new BasicEvent("Basic", "Door", 125, 63, new Date(12,04,2010), new Time(12,04,20), 1, 0.98, 1));
   list.add(new BasicEvent("Basic", "Detect", 127, 9, new Date(12,04,2010), new Time(12,05,29), 1, 0.98, -1));

   for(int i=0;i<list.size();i++) {System.out.println("list a poition " + i + " is " + BasicEvent.basicToString(list.get(i)));}

自定义类basicEvent的代码是

public class BasicEvent {
  public static String Level;
  public static String EType;
  public static double xPos;
  public static double yPos;
  public static Date date;
  public static Time time;
  public static double Rlb;
  public static double Sig;
  public static int Reserved;

  public  BasicEvent(String L, String E, double X, double Y, Date D, Time T, double R, double S, int Res){
   Level = L;
   EType = E;
   xPos = X;
   yPos = Y;
   date = D;
   time = T;
   Rlb = R;
   Sig = S;
   Reserved = Res;
  };

 public static String basicToString(BasicEvent bse){
   String out = bse.getLevel() + ";" + bse.getEtype() + ";" + bse.getxPos() + ";" + bse.getyPos() + ";" + bse.getDate().dateAsString() + ";" + bse.getTime().timeAsString() + ";" + bse.getRlb() + ";" + bse.getSig() + ";" + bse.getReserved();
   return out;
  }

3 个答案:

答案 0 :(得分:14)

班级BasicEvent的所有成员都是静态的,即他们在班级的所有实例之间共享。因此,在创建新实例时,旧实例的属性将被新值覆盖。

您应该将班级定义更改为

public class BasicEvent {
  public String Level;
  public String EType;
  public double xPos;
  public double yPos;
  public Date date;
  public Time time;
  public double Rlb;
  public double Sig;
  public int Reserved;
  ...
}

作为旁注,一般来说,使用公共字段并不是一种好的做法 - 最好将它们设为私有,并仅在需要时提供公共访问者/设置者。当然,在实验代码中它并不重要,但在生产质量代码中它确实如此。

答案 1 :(得分:1)

为什么所有班级成员都是静态的?

静态意味着整个VM中只有一个值,因此在每次创建实例时都会覆盖这些值(这不是ArrayList的问题)。

使你的成员变量非静态,并考虑将它们设为私有并用getter公开它们。

答案 2 :(得分:0)

嗯,BasicEvent中的所有字段都是静态的,因此它们属于类,而不属于对象。这意味着它们对于所有对象都是相同的。每次创建对象时,都要在这些字段上书写。

请查看有关静态字段的含义以及如何使用它们的Java文档。