我有这样的数据模型:
public class Person {
String name = "";
Integer id;
public Person() {
name = "";
id = new Integer(0);
}
}
首先,我创建了2个对象并添加到向量中。将向量转换为json字符串。在再次进行一些检查后,我已将json字符串转换为vector。在向量内部,它显示了正确数量的元素和数据。但是当我试图获得一个物体的位置时,它返回-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
答案 0 :(得分: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);
}
答案 1 :(得分:1)
您的Person
课程未覆盖equals()
(或hashCode()
)。
当您序列化为JSON然后反序列化时,这将创建Person
的新实例 - 就indexOf
和remove
而言,它们与原始实例完全不相等。它们恰好具有相同的name
和id
值,但这并不会自动使它们相等。
覆盖Object.equals()
和Object.hashCode()
,无论你想要什么样的平等(只是名字?只是ID?两个?),它应该没问题。
请注意,通常最好将字段设为私有,并提供属性getter / setter。
答案 2 :(得分:0)
remove()尝试通过equals()方法来删除对象。默认情况下,这是对象标识。为person生成一个显式的equals()方法(在eclipse中你可以使用所有字段生成一个)。 (当重写equals()时,你还需要一个匹配的hashcode()方法)