Vector仅填充了最后一项

时间:2017-11-09 20:17:09

标签: java android

目标是用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的指针......?

谢谢你们。

2 个答案:

答案 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() SetVector时,没有任何事情可以“锁定”其内容。因此Set的进一步更改也会影响Vector

同样,在你的程序中,在第一次循环迭代之后,Vector将保持对Hashtable的单个引用,其中包含第一个光标位置的内容。但是然后你的第二次迭代运行,再次覆盖Hashtableadd()的内容。现在,您的Vector将包含两个引用(对于相同的Hashtable),每个引用都包含第二个光标位置的内容。

此模式将重复,直到while循环终止,此时Vector将有X个引用(到同一个Hashtable),每个引用都包含最后一个光标位置的内容。