【问题标题】:Add elements to Arraylist and it replaces all previous elements in Java [duplicate]将元素添加到 Arraylist 并替换 Java 中所有以前的元素 [重复]
【发布时间】:2011-01-27 17:21:52
【问题描述】:

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

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

数组列表的代码是

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;
  }

【问题讨论】:

  • 尝试重新格式化 BasicEvent 的代码,使其看起来像问题中的实际代码,谢谢。
  • 你得到了什么输出,你期望什么?
  • 为什么你的班级成员是静态的?
  • new Date(12,04,2010) 至少有 2 个错误,可能是 3 个。2010 并不表示您认为在这种情况下发生的年份,04 是八进制二进制,只要您到达08 你会注意到问题,04(以及4)可能并不表示你认为的月份,请检查该构造函数的 Javadoc。

标签: java arraylist


【解决方案1】:

您的类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;
  ...
}

附带说明,一般来说,使用公共字段不是一个好习惯 - 最好将它们设为私有并仅在需要时提供公共访问器/设置器。当然,在实验代码中这无关紧要,但在生产质量代码中却很重要。

【讨论】:

  • 该死,太晚了:P +1 这确实是原因。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    请查看您的 Java 文档,了解静态字段的含义以及如何使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2019-11-15
      相关资源
      最近更新 更多