ArrayList 包含对象总是返回 false

Hab*_*ata 1 java contains arraylist object

这是我的代码:

package bikeproject;

import java.util.ArrayList;
import java.util.Random;

public class BikerList {
    public static void main(String[] args) {
        ArrayList<Bike> bikes = new ArrayList<Bike>();

        int mountainBikeSales = 0;
        int roadBikeSales = 0;

        fillArray(bikes);

        displayStock(bikes);

//      calculateStock(bikes);
        System.out.println(displayBkeNumbers(bikes));
    }

    static void fillArray(ArrayList<Bike> bikes) {
        Random rand = new Random();
//      int number = 2;
//      int a = rand.nextInt(2);

        for (int i = 0; i < 10; i++) {
            if (rand.nextInt(2) < 1) {
//              System.out.println(rand.nextInt(2));
                bikes.add(new MountainBike());
            } else {
//              System.out.println(rand.nextInt(2));
                bikes.add(new RoadBike());
            }
        }
    }

    static void displayStock(ArrayList<Bike> bikes) {
        for (Bike bike : bikes) {
            System.out.println(bike);
        }
    }

    static int calculateStock(ArrayList<Bike> bikes) {
        int bikesSold = 0;
        for (Bike bike : bikes) {
            if (bikes.contains(new MountainBike())) {
                bikesSold++;
            }
        }
        return bikesSold;
    }

    static String displayBkeNumbers(ArrayList<Bike> bikes) {
        int mb = 0;
        int rb = 0;

        mb = calculateStock(bikes);
        rb = bikes.size() - mb;

        return "\nStock Levels" + "\nWe have " + mb + " mountain Bike in Stock" + "\nWe have " + rb
                + " Road bikes in Stock";
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的相信该calculateStock()方法存在错误,因为它总是返回 false,在该calculateStock()方法中,bikesSold如果数组中的每辆自行车都是山地自行车的实例,我想将该值添加到变量中。

上面代码生成的输出:

Stock Levels
We have 0 mountain Bike in Stock
We have 10 Road bikes in Stock
Run Code Online (Sandbox Code Playgroud)

尽管山地自行车已经在ArrayList.

预期的输出,是这样的:

Stock Levels
We have 4 Mountain Bikes in stock
We have 6 Road Bikes in stock
Run Code Online (Sandbox Code Playgroud)

Gio*_*uri 5

static int calculateStock(ArrayList<Bike> bikes) {
    int bikesSold = 0;
    for (Bike bike : bikes) {
        if (bikes.contains(new MountainBike())) { //problematic line
            bikesSold++;
        }
    }
    return bikesSold;
}
Run Code Online (Sandbox Code Playgroud)

不起作用,因为.contains(Object o)

当且仅当此列表包含至少一个元素e 使得 Objects.equals(o, e)时才返回 true 。

因此,只要列表中至少有一个包含的实例(根据方法),它bikes.contains(new MountainBike())就会始终返回。trueMountainBike .equals(Object o)bikes

相反,您应该检查当前对象是否是您想要检查的特定类型的实例 ( MountainBike,在这种情况下),如下所示:

static int calculateStock(ArrayList<Bike> bikes) {
    int bikesSold = 0;
    for (Bike bike : bikes) {
        if (bike instanceof MountainBike) {
            bikesSold++;
        }
    }
    return bikesSold;
}
Run Code Online (Sandbox Code Playgroud)