0

我有一个这样的数据模型:

    public class Person {
        String name = "";
        Integer id;
        public Person() {
            name = "";
            id = new Integer(0);
        }
    }

首先,我创建了 2 个对象并添加到一个向量中。将向量转换为 json 字符串。再次检查后,我已将 json 字符串转换为向量。在向量内部,它显示了正确数量的元素和数据。但是当我试图获取一个对象的位置时,它会返回-1。即使使用 vector.remove() 我也无法删除该对象。如果我不将向量转换为 json 字符串,它就可以正常工作。以下是我的代码:

        Gson gson = new Gson();
        Vector vecResult = new Vector();

        Person person = new Person();
        person.name = "ABC";
        person.id = new Integer(1001);

        vecResult.add(person);

        Person person2 = new Person();
        person2.name = "DEF";
        person2.id = new Integer(1002);

        vecResult.add(person2);

        String json = gson.toJson(vecResult); //successful

        Type token = new TypeToken<Vector<Person>>() {}.getType();
        Vector<Person> vecResults = gson.fromJson(json3, token); //vecResults got 2 objects
        int pos = vecResults.indexOf(person); //returning -1
        boolean isRemoved = vecResults.remove(person); // returning false
4

3 回答 3

1

您需要覆盖以下

boolean equals(Object obj) 
int     hashCode()

您的代码不起作用,因为Vector#remove使用以下获取索引。

public synchronized int indexOf(Object o, int index) {
    if (o == null) {
        for (int i = index ; i < elementCount ; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = index ; i < elementCount ; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }

请注意,equals 的默认实现如下

public boolean equals(Object obj) {
    return (this == obj);
    }
于 2013-04-09T14:12:12.533 回答
1

您的Person课程不会覆盖equals()(或hashCode())。

当您序列化为 JSON 然后反序列化时,这将创建新的实例- 就和所关心的而言Person,这些实例完全不等于原始实例。它们碰巧具有相同的和值,但这并不会自动使它们相等。indexOfremovenameid

覆盖Object.equals()Object.hashCode()任何你想要的平等意义(只是名字?只是 ID?两者?)它应该没问题。

请注意,通常最好将字段设为私有,并提供属性 getter/setter。

于 2013-04-09T14:12:19.330 回答
0

remove() 尝试通过 equals() 方法定位对象。默认情况下,这是对象标识。为 person 生成一个显式的 equals() 方法(在 Eclipse 中,您可以使用所有字段生成一个)。(当覆盖 equals() 时,您还需要有一个匹配的 hashcode() 方法)

于 2013-04-09T14:13:09.020 回答