2015-04-19 1 views
-1

в Java У меня есть объект ResultSet, который я использую для заполнения HashMap объекта, таким образом:Абсурда поведения об объекте 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 инструкции ("A") он должен вернуть мне строку массива { "a1", "a2"}, а если я пишу hm.get ("б") он должен вернуть мне строку массива {"b1", "b2"}.

Но на практике, когда я пытаюсь получить значения, hashmap возвращает мне всегда последний массив, который я положил, независимо от ключа. Так что, если я пишу инструкции:

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

он печатает:

b1

b1

Почему HashMap это поведение? В чем проблема ?

+0

Что делать, если вы печатаете _actual 'HashMap'_, а не свой вывод отладки? Я думаю, что у вас есть ошибка в другом месте вашего кода. –

ответ

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(); 
    } 
+0

Вот в чем проблема: он пишет несколько раз в один массив, тем самым переопределяя ранее записанные значения – Dici

+0

О да - я идиот; вы совершенно правы. –

+0

Да, это работает, спасибо. Я думал, что, когда я помещаю объект в хэш-карту, он будет скопирован, а в значительной степени будет передан указатель. –