我的 ArrayList 正在覆盖,我不清楚为什么?每次进行新"add."时,它都会将所有以前的条目更改为此条目



我正在为uni创建有关注册汽车的程序。我有一个用于汽车的对象类和一个数组列表,可以将它们全部保留在中P>

我尝试将代码直接提升到主体中,并且它是相同的,并且我尝试了各种不同的小更改,例如我要比较的方式等。

这是我在汽车类文件中保留的addCar函数

public static ArrayList<Car> addCar(ArrayList<String> Makes, Integer CarCounter, ArrayList<Car> Cars) {
    Integer Select;
    boolean Equal = false;
    for (int i = 0; i < Makes.size(); i++) {
        System.out.println(i + ": " + Makes.get(i));
    }
    Scanner choice = new Scanner(System.in);
    {
        System.out.println("Enter Numeric Choice: ");
        while (!choice.hasNextInt()) {
            System.out.println("Error Please Enter Numeric Choice Again: ");
            choice.next();
        }
        Select = choice.nextInt();
    }
    if (Select >= Makes.size()) { 
        System.out.println("No records exist (Number entered too large)");
    } else {
        for (int i = 0; i < Makes.size(); i++) {
            if (Equal = Makes.get(i).equals(Makes.get(Select))) {
                break;
            }
        }
        if (Equal == true) {
            Car newCar;
            Make = Makes.get(Select);
            Reg = Input.getString("What is the registration: ");
            Model = Input.getString("What is the Model: ");
            Colour = Input.getString("What is the Colour: ");
            newCar = new Car();
            newCar.setMake(Make);
            newCar.setReg(Reg);
            newCar.setModel(Model);
            newCar.setColour(Colour);
            Cars.add(CarCounter, newCar);
        } else {
            System.out.println("Make is unavailable Please Try Again");
        }       
    }
    return Cars;
}

这是在主文件的主体中声明ArrayList的行

ArrayList<Car> Cars = new ArrayList<Car>();

在我的Switch Case菜单中为其中一个案例调用函数的行

Cars = Car.addCar(Makes, CarCounter, Cars);

例如,如果我将第一辆车设置为fiat,L4QWS,Punto,Silver,将第二辆车设置为Ferrari,4RE33,LaFerrari,Red,则应该是:

Car 1:
Make: fiat
Registration: L4QWS
Model: Punto
Colour: Silver
Car 2:
Make: Ferrari
Registration: 4RE33
Model: LaFerrari
Colour: Red

但是,实际上是:

Car 1:
Make: Ferrari
Registration: 4RE33
Model: LaFerrari
Colour: Red
Car 2:
Make: Ferrari
Registration: 4RE33
Model: LaFerrari
Colour: Red

可能永远不会增加 CarCounter,因此在调用 Cars.add(CarCounter, newCar)时,您总是始终覆盖列表中的第一个(和唯一(项目。您根本不需要CarCounter,因为它是多余的Cars.size()。对于将项目添加到列表中,只需使用Cars.add(newCar)肯定会将其添加到列表的末尾即可。谈到Integer参数:您不仅是通过使用Integer而不是int来调用该方法,因此出于性能原因,您应该更喜欢原始类型的int。在一些极少数情况下,您确实想通过Integer对象。而且,如果您真的想要通过引用传递整数,则将其包装到数组中,或者使用某些包装程序类,例如AtomicInteger

问题是汽车类的数据成员定义为static。这意味着在汽车类的所有实例之间共享此类数据成员的副本。

所以,当您创建新车并设置其价值时,它们会通过所有汽车出现。

一般而言,静态数据应该是例外,而不是规则。关于创建班级单独实例的重点是它们应该确实是分开的。

最新更新