对象中的存储列表/ LinkedList作为字段

时间:2017-12-31 12:56:10

标签: java

在过去的几天里,我一直想弄清楚如何使用linkList作为类字段。在我的项目中,我正在创建对象,而不是在几次之后,我想用linkedList设置字段。我在下面做了这个问题的简单模型。首先,我们创建新的" Car",而不是我们正在设置ArrayList(与linkedlIst相同的问题),而不是我们添加到汽车列表中。在此过程中,每件事都可以。对象获取此列表并在其中查看。但是当我向列表中添加更多对象或者只生成另一个LinkedList(另一个对象的Classfield)时,所有对象都将获得与上一个对象相同的新字段。以下是:

public static void main(String[] args) {
    ArrayList<LinkedList> colors = new ArrayList();
    LinkedList<LinkedList> opcje = new LinkedList();
    List<Car>  cars = new ArrayList<>();

    Car car1 = new Car("Ford1");
    colors.add(generateColors(car1));
    car1.setColors(colors);
    cars.add(car1); 
    colors.clear();
    Car car2 = new Car("Ford2");
    colors.add(generateColors(car2));
    car2.setColors(colors);
    cars.add(car2);
    colors.clear();
    Car car3 = new Car("Ford3");
    colors.add(generateColors(car3));
    car3.setColors(colors);
    cars.add(car3);
    System.out.println(car1.getColors().toString());
    System.out.println(car1.getColors());
    for(Car c : cars) {
        System.out.println(c.toString());
    }

    System.out.println(car1.getColors().toString());
}

和Car.class

public class Car {
    private String name;
    private String engine;
    private ArrayList<LinkedList> colors;

    public Car(String name) {
        this.name=name;
    }

    public ArrayList<LinkedList> getColors() {
        return colors;
    }

    public void setColors(ArrayList<LinkedList> colors) {
        System.out.println("Setting up colors for "+colors.toString());
        this.colors = colors;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "name : "+name+" colors: "+colors.toString();
    }
}

结果将是:

name : Ford1 colors: [[Ford3]]
name : Ford2 colors: [[Ford3]]
name : Ford3 colors: [[Ford3]]

我做错了什么?

1 个答案:

答案 0 :(得分:1)

所有Car个实例指向颜色[[Ford3]]的原因是它们都指向ArrayList colors的单个实例。由于您在每个ArrayList<LinkedList>中存储对Car的引用,因此ArrayList实例必须是唯一的以及LinkedList实例。 要获得所需的行为,您可以将行colors.clear();替换为colors = new ArrayList<>();

完全清理的例子:

主:

package so.q48042638;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<List<String>> colors = new ArrayList<>();
        List<Car> cars = new ArrayList<>();

        Car car1 = new Car("Ford1");
        colors.add(generateColors(car1));
        car1.setColors(colors);
        cars.add(car1);

        Car car2 = new Car("Ford2");
        colors = new ArrayList<>();
        colors.add(generateColors(car2));
        car2.setColors(colors);
        cars.add(car2);

        Car car3 = new Car("Ford3");
        colors = new ArrayList<>();
        colors.add(generateColors(car3));
        car3.setColors(colors);
        cars.add(car3);

        for (Car c : cars) {
            System.out.println(c);
        }
    }

    private static List<String> generateColors(Car car) {
        List<String> opcje = new LinkedList<>();
        opcje.add(car.getName());
        return opcje;
    }
}

汽车:

package so.q48042638;

import java.util.List;

public class Car {
    private String name;
    private List<List<String>> colors;

    public Car(String name) {
        this.name = name;
    }

    public List<List<String>> getColors() {
        return colors;
    }

    public void setColors(List<List<String>> colors) {
        this.colors = colors;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "name : " + name + " colors: " + colors;
    }
}