Java 比较对象永远不会返回true

Java 比较对象永远不会返回true,java,Java,我试图比较两个相同类型的对象(在方法doeswave中),但从未得到“true”返回。这是我的密码: private ArrayList<Osoba> osoba = new ArrayList<Osoba>(); public boolean doesHave(Osoba o) { for (int i = 0; i < osoba.size(); i++) { if (pobierz(i).equals(o))

我试图比较两个相同类型的对象(在方法doeswave中),但从未得到“true”返回。这是我的密码:

private ArrayList<Osoba> osoba = new ArrayList<Osoba>();    

public boolean doesHave(Osoba o) {
        for (int i = 0; i < osoba.size(); i++) {
            if (pobierz(i).equals(o))
                return true;
        }
        return false;
    }

public Osoba pobierz(int index) {
            return osoba.get(index);
        }
来自main的代码:

Osoba osoby = new Osoba(name, surname);
if (kartoteka.doesHave(osoby) == Boolean.TRUE) {
            temp = odczyt.nextLine();
            if (temp.equals("y"))
                kartoteka.usun(osoby); //some method
            else
                ...
        }
不管我使用什么输入,这部分永远不会发生。 “kartoteka”是我的包裹,当然是我进口的。每个类都在单独的包中,但是使用它们没有问题。我已经在谷歌上搜索了很长一段时间,但没有任何帮助,只是看起来

if (kartoteka.doesHave(osoby) == Boolean.TRUE)

这从来都不是真的,但我不知道为什么。没有Boolean.TRUE的代码也不能正常工作。如果我能得到一些提示,我会很感激的。很抱歉问这样的问题,但我是java新手。

现在,您的代码检查两个对象的内存地址是否相同,只有当它是相同的对象时,这才是真的


您需要实现一种方法来比较两个
Osoba
对象,方法是比较您想要从这些对象中获得的属性,并适当地返回
true/false

现在,您的代码检查两个对象的内存地址是否相同,而只有当它是同一个确切的对象时,这才是真的


您需要实现一种方法来比较两个
Osoba
对象,方法是比较您想要从这些对象中获得的属性,并适当返回
true/false

Osaba
应实现
equals

@Override
public boolean equals(Object other) {
    return imie.equals(((Osaba) other).getImie())
        && nazwisko.equals(((Osaba) other).getNazwisko()));
}

如果不实现equals,将使用默认实现。

Osaba
应实现
equals

@Override
public boolean equals(Object other) {
    return imie.equals(((Osaba) other).getImie())
        && nazwisko.equals(((Osaba) other).getNazwisko()));
}

如果您没有实现equals,将使用默认实现。

想象您和您的妻子有双胞胎

他们是同一个人吗?不,他们不是。让我们称他们为双胞胎A和双胞胎B。他们是两个不同的例子,是的,他们看起来是一样的,但如果你说的是双胞胎A,你就不是在说双胞胎B,反之亦然。关键是,它们不相等:),这在Java中是一样的。双胞胎A只和它自己相等,而不是和它自己相等

您必须创建自己的方法,该方法比较两个Osoba实例的所有属性


另一个选项是重写equals和hashCode方法,但这在您的情况下不是一个好方法。

想象一下,您和您的妻子有一对双胞胎

他们是同一个人吗?不,他们不是。让我们称他们为双胞胎A和双胞胎B。他们是两个不同的例子,是的,他们看起来是一样的,但如果你说的是双胞胎A,你就不是在说双胞胎B,反之亦然。关键是,它们不相等:),这在Java中是一样的。双胞胎A只和它自己相等,而不是和它自己相等

您必须创建自己的方法,该方法比较两个Osoba实例的所有属性


另一个选项是覆盖equals和hashCode方法,但在您的情况下,这不是一个好方法。

来自@libik和@Code Whisper的响应帮助了我,所以如果有人有同样的问题,请阅读并尝试理解,这对我有帮助。我喜欢双胞胎寓言:)当我试着比较两个字符串时,情况是一样的

来自@libik和@Code Whisper的回复帮助了我,所以如果有人有同样的问题,请阅读并尝试理解,这对我很有帮助。我喜欢双胞胎寓言:)当我试着比较两个字符串时,情况是一样的

Osoba
类必须实现
equals
方法和
hashCode
并遵循最佳实践。将
boolean
值与
boolean进行比较。TRUE
会带来麻烦。它需要将布尔返回值框入一个
boolean
实例,然后检查它是否与
boolean.TRUE
相同。可能重复的可能重复:
Osoba
类必须实现
equals
方法,和
hashCode
以及遵循最佳实践。将
boolean
值与
boolean.TRUE
进行比较是自找麻烦。它需要将布尔返回值框入一个
boolean
实例,然后检查它是否与
boolean.TRUE
相同。可能重复的可能重复:如果
other
是另一种类型或null,则会出现异常。为什么要用另一个类的对象调用equals?因为
equals()
被设计为接受任何类的对象。但我永远不会那样使用它。那么,如果instanceof check在我的代码中总是返回true,我为什么要添加它呢?这只是在打字和执行上浪费时间。@Manu您可以自由地在自己的项目中按自己的意愿编写代码,没有人会阻止您(我们将继续不同意,但这并不重要)。但是,如果发布其他人将要使用的答案,那么您需要遵循语言社区(在本例中为java)定义的指导原则,否则您将收到否决票。如果
other
属于其他类型或为空,您将得到一个例外。为什么要用另一个类的对象调用equals?因为
equals()
被设计为接受任何类的对象。但我永远不会那样使用它。那么,如果instanceof check在我的代码中总是返回true,我为什么要添加它呢?这只是在打字和执行上浪费时间。@Manu您可以自由地在自己的项目中按自己的意愿编写代码,没有人会阻止您(我们将继续不同意,但这并不重要)。但是,如果发布其他人将要使用的答案,那么您需要遵循语言社区(在本例中为java)定义的指导原则,否则您将收到反对票。