1

我得到了这个代码:

    System.out.println("Enter the brand and cash value");

    String brand = keyboard.nextLine();

    long cash = keyboard.nextDouble();
    String buffer = keyboard.nextLine();

但即使我输入了我要比较的确切字符串值,它也无法识别它们是相同的。奇怪的是,当我输入这个时:

compare[0] = new Car ("BMW", 12.00);

而不是这个:

compare[0] = new Car (brand, 12.00);

有用

我也使用等于:

public boolean equals(Car other)
{
    if (other == null)
    {
        return false;
    }

    if(this.brand == other.brand && this.cash == other.cash)
    {
        return true;
    }
    else
    {
        return false;
    }
}
4

3 回答 3

5

您正在使用==测试字符串相等性,并且"BMW"是一个字符串文字,它被实习在一个池中,而brand不是。换句话说,如果您有:

String s1 = "BMW";
String s2 = "BMW";
String s3 = getString(); //receives "BMW" from the scanner

s1 == s2是真的
s1 == s3是假
s2 == s3是假
s1.equals(s2)是真的
s1.equals(s3)是真的
s2.equals(s3)是真的

底线:你应该equals用来比较字符串。

您可以在这篇文章中阅读更多相关信息。

编辑

在您的equals方法的代码中,您需要更改

if(this.brand == other.brand && this.cash == other.cash)

对此:

if(this.brand.equals(other.brand) && this.cash == other.cash)

另请注意,您的还有一些其他问题equals- 特别是,它不会覆盖 equals:它应该是public boolean equals(Object o)

编辑 2

例如,您可以像这样实现您的 equals 方法(它假设品牌不能为空 - 如果不是这种情况,您也需要处理该特定情况)

@Override
public boolean equals(Object obj) {
    if (obj == null || getClass() != obj.getClass()) {
        return false;
    }

    final Car other = (Car) obj;
    return (this.cash == other.cash && this.brand.equals(other.brand));
}

请注意,您还应该覆盖该hashcode方法。

于 2012-11-24T07:19:05.253 回答
1

你需要使用

this.brand.equals(other.brand)

在您的if条款中,而不是

this.brand == other.brand

用于检查 String的==引用及其值..

在这种情况下,您的值是相同的,但不是参考值。

因此,您需要使用equals因为它仅用于检查值。
我猜这就是你想要做的。

于 2012-11-24T07:57:02.087 回答
0

使用java.lang.Object如下所示的相等方法

public boolean equals(Car other)
{
    if (other == null)
    {
        return false;
    }

    if(this.brand.equals(other.brand) && this.cash.equals(other.cash))
    {
        return true;
    }
    else
    {
        return false;
    }
}
于 2012-11-24T07:56:10.870 回答