我有一个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有这种行为?问题在哪里?
答案 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();
}