HashMap不复制对象

时间:2015-04-19 19:35:30

标签: java arrays hashmap

Java中的

我有一个ResultSet对象,用于填充HashMap对象,这样:

        rs = db.executeQuery(query);
        rs.last();
        rows = rs.getRow();
        rs.beforeFirst();
        String current;
        String[] current_columns = new String[rows];
        int x;
        for(int i=0; i<n_col; i++){ //scroll columns
            x=0;
            while(rs.next()){ // scroll rows
                current = rs.getString(columns[i]);
                current_columns[x++] = current;
            }

            //a little output debug
            System.out.print("hm.put("+columns[i]+", {");
            for(int j=0; j<current_columns.length; j++)
                System.out.print(current_columns[j]+" ");
            System.out.println("});");
            //end of output debug

            hm.put(columns[i], current_columns);

            rs.beforeFirst();

        }

输出调试打印:

  

hm.put(a,{a1 a2});

     

hm.put(b,{b1 b2});

所以,如果我写指令hm.get(&#34; a&#34;)它应该返回数组字符串{&#34; a1&#34;,&#34; a2&#34;},如果我写hm.get(&#34; b&#34;),它应该返回数组字符串{&#34; b1&#34;,&#34; b2&#34;}。

但是,实际上,当我尝试获取值时,无论密钥如何,hashmap总是返回我放置的最后一个数组。 所以,如果我写下说明:

System.out.println(hm.get("a")[0]);
System.out.println(hm.get("b")[0]);

打印:

  

B1

     

B1

为什么hashmap有这种行为?问题在哪里?

1 个答案:

答案 0 :(得分:6)

您总是使用相同的数组,因此所有键都映射到同一个对象,您应该将它声明为循环内而不是在外面。

    int x;
    for(int i=0; i<n_col; i++){ 
        // This time you declare a NEW array each time
        String[] current_columns = new String[rows];
        x=0;
        while(rs.next()){ 
            current = rs.getString(columns[i]);
            current_columns[x++] = current;
        }

        System.out.print("hm.put("+columns[i]+", {");
        for(int j=0; j<current_columns.length; j++)
            System.out.print(current_columns[j]+" ");
        System.out.println("});");

        hm.put(columns[i], current_columns);

        rs.beforeFirst();
    }