从nextLine读取的输入不等于String值

时间:2012-11-24 07:10:02

标签: java string

我收到了这段代码:

    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);

它有效

我也使用equals:

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

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

3 个答案:

答案 0 :(得分:2)

您正在使用==来测试字符串相等性,"BMW"是字符串文字,它是在池中实现的,而brand则不是。{1}}。换句话说,如果你有:

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来比较字符串。

您可以在this post中了解更多相关信息。

修改

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

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

到此:

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

另请注意,equals还存在一些其他问题 - 尤其是它不会覆盖等于:它应该是public boolean equals(Object o)

编辑2

例如,你可以像这样实现你的equals方法(它假设品牌不能为null - 如果不是你需要处理那个特定情况的话)

@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方法。

答案 1 :(得分:1)

您需要使用

this.brand.equals(other.brand)

if子句中而不是

this.brand == other.brand

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

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

因此您需要使用equals因为它仅用于检查值 那就是你想做的事情。

答案 2 :(得分: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;
    }
}