在过去的几天里,我一直想弄清楚如何使用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]]
我做错了什么?
答案 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;
}
}