【问题标题】:How to look up for exact same objects with .contains() method in java? [duplicate]如何在 java 中使用 .contains() 方法查找完全相同的对象? [复制]
【发布时间】:2022-01-16 22:02:38
【问题描述】:

这个想法很简单,我不需要添加已经在列表中的对象。我想问题在于它创建了一个全新的对象,并且找不到与列表中已经存在的其他相同对象的匹配项(我可能完全错了)。

import java.util.Scanner;
import java.util.ArrayList;

public class archive {
    
    private String indentifier;
    private String name;
    
    public archive(String indentifier,String name) {
        this.name = name;
        this.indentifier = indentifier;
    }
    public String toString() {
        return this.indentifier + ": "+this.name;
    }

    public static void main(String[] args) {
        ArrayList<archive> arhivs = new ArrayList<>();
        Scanner scan = new Scanner(System.in);
        String indentifier, name;
        while(true) {
            System.out.println("Indentifier? (empty will stop)");
            indentifier = scan.nextLine();
            if(indentifier.isEmpty()) {
                break;
            }
            System.out.println("Name?(empty will stop)");
            name = scan.nextLine();
            if(name.isEmpty()) {
                break;
            }
            archive newAr = new archive(indentifier,name);
            
            if(arhivs.contains(newAr)) {
                System.out.println("Item is on the list");
            }else {
                arhivs.add(newAr);
            }
            
            
        }
        System.out.println("==Items==");
        for(archive arhivi:arhivs) {
            System.out.println(arhivi);
        }
        scan.close();

    }

}

【问题讨论】:

  • Java 中的类名应以大写字母开头。
  • 嗯,是的,如果您构造一个新的archive,它将是一个唯一的对象,并且不等于 ArrayList 中的任何内容。您可以改为循环并比较 indentifier 和/或 name 值以检查重复项。
  • contains 方法使用 equals() 方法检查对象是否相等。由于您的 archive 类不会覆盖 equals,因此这不会达到您的预期。
  • 所以我必须创建自己的 equals 方法并循环遍历每个对象?
  • @user16731988 不是循环,只需覆盖 equals 方法来比较您想要的任何值

标签: java arraylist


【解决方案1】:

覆盖equals(&hashCode

您忽略了提供对继承的 Object#equalsObject#hashCode 方法的覆盖。

equals的默认实现使用identity来比较,即“被比较的两个对象引用是否共享相同的隐式内存地址?”。

相反,您想比较两个对象的内容。因此,您需要在自己的 equals 方法中编写内容比较代码。并且无论何时覆盖equals,通常最好使用相同的逻辑覆盖hashCode

您的IDE 将帮助您编写该代码。例如,在IntelliJ 中,请参阅this documentationthis discussion

这个问题在 Stack Overflow 上已经讨论过很多次了。所以search to learn more

记录

顺便说一下,您可以更简单地将您的类定义为record

record Archive ( String identifier , String name ) {}

当你的类的主要目的是透明和不可变地传递数据时,记录是合适的。

编译器隐式创建构造函数、getter、equals & hashCodetoString 方法。

?? 所以使用记录会让你的问题没有实际意义,假设你想比较类中的每个成员字段。为您提供了 equalshashCode 覆盖。

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 2020-02-12
    • 1970-01-01
    • 2017-01-05
    • 2017-09-20
    • 1970-01-01
    • 2021-05-18
    • 2021-07-23
    • 2017-08-14
    相关资源
    最近更新 更多