gpt4 book ai didi

java - 序列化后无法在列表中找到项目

转载 作者:行者123 更新时间:2023-11-30 05:53:06 25 4
gpt4 key购买 nike

首先,我创建项目 A。然后将项目 A 添加到列表 A。然后将项目 A 序列化到文件中,然后从同一文件中读取项目 A。最后,我从列表 A 中找到读取的项目 B。在列表 A 中找到项目 B 失败。 println 语句的结果是-1。我的问题是为什么?

public class ListTest {

public static void main(String[] args) {

Item a = new Item("a");
List<Item> listA = new ArrayList<Item>();
listA.add(a);

try (FileOutputStream fos = new FileOutputStream(new File("text.dat"));
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(a);

try (FileInputStream fis = new FileInputStream(new File("text.dat"));
ObjectInputStream ois = new ObjectInputStream(fis)) {
Item b = (Item) ois.readObject();
System.out.println(listA.indexOf(b));
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
}

** 编辑 1 **

该商品的代码在哪里。

public class Item implements Serializable {

private static final long serialVersionUID = 1L;

private String mName;

public Item(String name) {
mName = name;
}

public String getName() {
return mName;
}

public void setName(String name) {
mName = name;
}
}

最佳答案

您的代码有 2 个问题:

  1. 要检查列表中是否存在元素,您需要使用.contains()更改此

    listA.indexOf(b);

    listA.contains(b);

    来自docs,

    boolean contains(Object o)

    Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).

  2. 现在,由于您正在检查对象的相等性,因此您需要覆盖 Item 类中的 equals()hashcode()。将以下方法添加到 Item

    class Item implements Serializable {

    private static final long serialVersionUID = 1L;

    private String mName;

    // getters and setters

    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((mName == null) ? 0 : mName.hashCode());
    return result;
    }

    @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    Item other = (Item) obj;
    if (mName == null) {
    if (other.mName != null)
    return false;
    } else if (!mName.equals(other.mName))
    return false;
    return true;
    }

    }

    现在您知道,如果两个对象的所有属性都具有相同的值,则两个对象相等。如果您现在检查 contains() ,它将返回 true

关于java - 序列化后无法在列表中找到项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53590216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com