目标是用Hashtables填充Hashtables的向量。
为此,我迭代一个游标,将光标找到的内容放入Hashtable中,然后将Hashtable添加到向量中,如下所示:
Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>();
Hashtable<String,String> h = new Hashtable<String,String>();
while(cursor.moveToNext()) {
h.put("name", cursor.getString(0));
h.put("region", cursor.getString(1));
h.put("_id", cursor.getString(2));
v.addElement(h);
}
结果是一个Vector填充了游标中的最后一个元素,如果游标遍历X个元素,那么Vector的X次是最后一个创建的Hashtable。
添加这一行可以解决问题:
Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>();
Hashtable<String,String> h = new Hashtable<String,String>();
while(cursor.moveToNext()) {
h = new Hashtable<String,String>(); // <--THIS LINE HERE
h.put("name", cursor.getString(0));
h.put("region", cursor.getString(1));
h.put("_id", cursor.getString(2));
v.addElement(h);
}
但我不完全明白为什么......
向量是否只保留指向Hashtables的指针......?
谢谢你们。
答案 0 :(得分:1)
在第一个代码块中,你只是覆盖了同一个对象,所以假设你在while循环中迭代了两次。如果第一个实例有name =“a”,region =“b”和_id =“c”,那么在下一次迭代中,因为你没有创建一个新实例,所以对象的名称,区域和_id字段将被覆盖无论你赋予他们什么价值。因此,您有两个项目,它们的属性都具有相同的值。
答案 1 :(得分:1)
在您的第一个代码示例中,通过while
循环的每次迭代都会使用当前光标位置的内容填充相同的 Hashtable
。在第二个代码示例中,调用构造函数(new Hashtable()
部分)可确保每次迭代每次都填充不同的 Hashtable
。
请注意,对于集合,可以以不明显的方式修改它们。想象一下,我们有这个程序:
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("world");
Vector<Set<String>> v = new Vector<>();
v.add(set);
set.clear();
System.out.println(v);
}
您可能会惊讶地发现这会打印以下内容:
[[]]
当您add()
Set
到Vector
时,没有任何事情可以“锁定”其内容。因此Set
的进一步更改也会影响Vector
。
同样,在你的程序中,在第一次循环迭代之后,Vector
将保持对Hashtable
的单个引用,其中包含第一个光标位置的内容。但是然后你的第二次迭代运行,再次覆盖Hashtable
和add()
的内容。现在,您的Vector
将包含两个引用(对于相同的Hashtable
),每个引用都包含第二个光标位置的内容。
此模式将重复,直到while
循环终止,此时Vector
将有X个引用(到同一个Hashtable
),每个引用都包含最后一个光标位置的内容。