添加到静态ArrayList只是覆盖第一个元素

时间:2016-11-15 07:22:57

标签: java arraylist static

我的代码中有一个名为jobsList的静态arrayList。我想使用静态方法向其添加元素。由于某种原因,它覆盖了jobList,因此每次添加元素时,第一个元素都是我刚刚添加的元素而没有其他内容。如同,没有添加任何其他元素。相关代码如下:

public static ArrayList<Job> jobList = null;

public JobSchedule() {
    jobList = new ArrayList<Job>(10);

}

public static Job addJob(int time) {
    System.out.println("Adding job " + time);
    Job j = new Job(time);

    jobList.add(j);
    System.out.println("Current joblist size: " + jobList.size());
    System.out.println("First element: " + jobList.get(0).weight);
    return j;
}

printlines的输出如下所示:

Adding job 8
Current joblist size: 1
First element: 8
Adding job 5
Current joblist size: 1
First element: 5

理想情况下,每次添加它都会增加大小并将作业放在正确的索引处,所以我不确定为什么会覆盖arraylist。

5 个答案:

答案 0 :(得分:3)

我认为你每次都在调用构造函数,

logcat

每次调用它时都会创建一个新的ArrayList。

不需要构造函数。做这样的事情:

JobSchedule(){
    jobList = new ArrayList<Job>(10);
}

答案 1 :(得分:1)

在当前代码中,当您调用构造函数new JobSchedule()时,将创建一个全新的ArrayList对象并分配给相同的引用

事实上,我建议您使用jobListprivatestatic标记final引用变量,如下所示:

private static final ArrayList<Job> jobList = new ArrayList<Job>(10);
public JobSchedule() {
}
public static Job addJob(int time) {
  System.out.println("Adding job " + time);
  Job j = new Job(time);

  jobList.add(j);
  System.out.println("Current joblist size: " + jobList.size());
  System.out.println("First element: " + jobList.get(0).weight);
  return j;
}

private - 可以在同一个班级中访问

static - 维护整个班级的单一副本

final - 无法使用新的arraylist

重新分配引用(也无法继承)

不建议将整个jobList (arraylist)公开为public变量,而是尝试使用某种Job方法获取特定的getJob(T t)(原因是我将其标记为private)。

答案 2 :(得分:0)

最可能的原因是,在调用addJob(5)之前,您正在调用构造函数JobSchedule(),它会覆盖静态列表。

要解决此问题,请避免在实例方法中初始化静态变量

public static ArrayList<Job> jobList = new ArrayList<Job>(10);

public JobSchedule() {
}

代码应该按预期工作。或者,使jobList字段和addJob方法都是非静态的。在调用addJob

之前,您每次都不得调用构造函数

答案 3 :(得分:0)

感谢您的帮助。我最后重写了我的代码,以便它需要一个空的构造函数,并使子类只是一个普通的嵌套类,在nestedclass对象中传入一个超类的实例,然后能够在其上调用sort()。 p>

public JobSchedule() {}

public Job addJob(int time) {
    Job j = new Job(time, this);
    jobList.add(j);
    return j;
}

Nested class...{
public JobSchedule schedule = null;

    private Job(int time, JobSchedule schedule)
    {
        this.schedule = schedule;
        this.weight = time;
    }

    public int getStartTime() {
        schedule.kahnSort();
        .
        .
        .
}

答案 4 :(得分:0)

我认为每次在新的JobSchedule对象之前添加元素。不要在构造函数

中实例化静态ArrayList