Java Contains in Array List 不会查看数组列表是否包含该对象,而是查看对象 Id

问题描述 投票:0回答:1
public class Contact {
    public static void main(String[] args) {
        MobilePhone mobilePhone = new MobilePhone("sdfjds");
        System.out.println(mobilePhone.addNewContact((createContact("Burak", "3445"))));
        System.out.println(mobilePhone.addNewContact((createContact("Burak", "3445"))));

    }

    private String name;
    private String phoneNumber;

    public Contact(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public static Contact createContact(String name, String phoneNumber) {
        return new Contact(name, phoneNumber);
    }
}
import java.util.ArrayList;

public class MobilePhone {

    private String myNumber;
    private ArrayList<Contact> myContacts;

    public MobilePhone(String myNumber) {
        this.myNumber = myNumber;
        this.myContacts = new ArrayList<Contact>();
    }

    public boolean addNewContact(Contact contact) {
        if (!myContacts.contains(contact)) {
            myContacts.add(contact);
            return true;
        } else {
            return false;
        }
    }

    public boolean updateContact(Contact oldContact, Contact newContact) {
        if (myContacts.contains(oldContact)) {
            myContacts.set(myContacts.indexOf(oldContact), newContact);
            return true;
        } else {
            return false;
        }
    }

    public boolean removeContact(Contact contact) {
        if (myContacts.contains(contact)) {
            myContacts.remove(myContacts.indexOf(contact));
            return true;
        } else {
            return false;
        }
    }

    private int findContact(Contact contact) {
        return myContacts.indexOf(contact);
    }

    private int findContact(String contactName) {
        for (Contact contacts : myContacts) {
            if (contacts.getName().equals(contactName)) {
                return 1;
            }
        }
        return -1;
    }

    public Contact queryContact(String contact) {
        for (Contact contacts : myContacts) {
            if (contacts.getName().equals(contact)) {
                return contacts;
            }
        }
        return null;
    }

    public void printContacts() {
        System.out.println("Contact List:");
        int number = 1;
        for (Contact contacts : myContacts) {
            System.out.println(number + ". " + contacts.getName() + " -> " + contacts.getPhoneNumber());
        }
    }
}

调试了为什么会出现这种现象。

我期望 contains 方法在第一次输入时返回 true,当我再次尝试完全相同的操作时返回 false。但似乎创建了一个新对象,当我调用 Array List Contains 时,它总是会有所不同,因为每次创建新联系人时分配的 id 都是不同的?这似乎有点不明确,所以我想问一下。如果我不能这样使用 contains 有什么用?您能否告诉我有关在不更改代码的情况下使用数组列表包含的见解。我可以更改代码并使其工作,但我想使用数组列表 (.) 包含。

java arraylist boolean contains new-operator
1个回答
0
投票

List
API 指定
contains
方法使用
equals(Object)
方法来确定对象是否在列表中。并且
ArrayList
符合本合同。

但就您而言,您尚未在

equals(Object)
类中声明
Contact
方法。这意味着
Contact
继承了
equals(Object)
Object
方法,基于引用相等性进行测试

解决方案:适当地覆盖

equals(Object)
contains
将按照你想要的方式工作。我将让您找出正确的实施方法
equals
。请注意,您不应假设参数始终是
Contact

© www.soinside.com 2019 - 2024. All rights reserved.