将哈希映射放入另一个集合的java问题
在下面的代码中,当在循环内打印时,子hashmap显示正确的值,但当在循环外打印父hashmap时,子hashmap显示的是一个映射,其中只有上一个条目的值覆盖了所有值
public void compareOracleMySQLData() throws SQLException { String inputTableName = ConfigurationManager.getProperty("table_name"); int i = 0; int j = 0; int colCount = 0; int oracleRowCount = 0; int mysqlRowCount = 0; String primaryKeyIni = null; String appendStuff = null; Connection conO = DBManager.openDbConnection("mysql"); Connection conM = DBManager.openDbConnection("mysql"); Statement stmtO = null; Statement stmtM = null; ResultSet resultSetO = null; ResultSet resultSetM = null; ArrayList<String> primaryKeyList = new ArrayList<String>(); Iterator<String> primaryKeyListItr = null; HashMap<Object, Object> oraRowDetailsMap = new HashMap<Object, Object>(); HashMap<String, Object> mysqlRowDetailsMap = new HashMap<String, Object>(); Map<String, Object> oraRowPrimaryMap = new HashMap<String, Object>(); HashMap<String, HashMap<String, Object>> mysqlRowPrimaryMap = new HashMap<String, HashMap<String, Object>>(); // Map<String, Object> oraRowPrimaryMap=new HashMap<String, Object>(); // Map<String, Object> mysqlRowPrimaryMap=new HashMap<String, Object>(); try { if (conO != null && conM != null) { if (validateTableStatus(inputTableName, conO, conM)) { // Check table existence in Oracle and Mysql Database // Create resultset for oracle stmtO = conO.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); resultSetO = stmtO.executeQuery(DB_QUERY); ResultSetMetaData rsMetaDataO = resultSetO.getMetaData(); // // MySql details for the same table created stmtM = conM.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); resultSetM = stmtM.executeQuery(DB_QUERY); // Get Column Count for two tables ResultSetMetaData rsMetaDataM = resultSetM.getMetaData(); logger.debug("Column Count in Oracle table ::" + rsMetaDataO.getColumnCount()); logger.debug("Column Count in Mysql table ::" + rsMetaDataM.getColumnCount()); // Match Column count of two tables if (rsMetaDataM.getColumnCount() == rsMetaDataO .getColumnCount()) { logger.debug("The Column count in both table are same"); oracleRowCount = getRowCount(inputTableName, resultSetO); mysqlRowCount = getRowCount(inputTableName, resultSetM); logger.debug("No of Rows of Oracle Table :: " + oracleRowCount); logger.debug("No of Rows of Mysql Table :: " + mysqlRowCount); if (oracleRowCount != mysqlRowCount) { logger .debug("The number of rows of Oracle and Mysql tables respectively differs"); } else { primaryKeyList = getPrimaryKey(inputTableName, conO); while (resultSetO.next()) { i = 0; primaryKeyListItr = primaryKeyList.iterator(); while (primaryKeyListItr.hasNext()) { if (i == 0) { primaryKeyIni = (resultSetO .getObject(primaryKeyListItr .next().toString())) .toString().trim(); } else { appendStuff = (resultSetO .getObject(primaryKeyListItr .next().toString())) .toString().trim(); primaryKeyIni = primaryKeyIni + "$" + appendStuff; } i++; } // colCount = rsMetaDataO.getColumnCount(); for (j = 1; j <= colCount; j++) { System.out.println("Col Name"+rsMetaDataO .getColumnName(j)); System.out.println("Col Value"+ resultSetO .getObject(rsMetaDataO .getColumnName(j))); oraRowDetailsMap.put(rsMetaDataO .getColumnName(j), resultSetO .getObject(rsMetaDataO .getColumnName(j))); } System.out.println("primaryKeyIni"+primaryKeyIni); System.out.println("oraRowDetailsMap inside loop"+oraRowDetailsMap); oraRowPrimaryMap.put(primaryKeyIni, oraRowDetailsMap); } System.out.println("oraRowDetailsMap"+oraRowDetailsMap);System.out.println(oraRowPrimaryMap); } } else { logger.debug("The number of Columns of Oracle and Mysql table differs"); } } } } catch (SQLException e) { logger.debug("Error in CompareOracleMySQLData()" + e.getMessage()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBManager.closeConnection(conO); DBManager.closeConnection(conM); DBManager.closeStatement(stmtO); DBManager.closeStatement(stmtM); DBManager.closeResultSet(resultSetO); DBManager.closeResultSet(resultSetM);}}
二,。输出如下所示:
DEPLOYMENT_LEVEL is: DVL
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to MYSQL database established
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to MYSQL database established
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Oracle table ::4
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Mysql table ::4
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - The Column count in both table are same
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Oracle Table :: 3
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Mysql Table :: 3
Col NameFirst_Name
Col Valuefn
Col NameLast_Name
Col Valueln
Col NameAddress
Col Valueadr
Col NameCity
Col Valuecity
primaryKeyInifn$ln
oraRowDetailsMap inside loop{Address=adr, Last_Name=ln, First_Name=fn, City=city}
Col NameFirst_Name
Col Valuefn1
Col NameLast_Name
Col Valueln1
Col NameAddress
Col Valueadr1
Col NameCity
Col Valuecity1
primaryKeyInifn1$ln1
oraRowDetailsMap inside loop{Address=adr1, Last_Name=ln1, First_Name=fn1, City=city1}
Col NameFirst_Name
Col Valuefn3
Col NameLast_Name
Col Valueln3
Col NameAddress
Col Valueadr3
Col NameCity
Col Valuecity3
primaryKeyInifn3$ln3
oraRowDetailsMap inside loop{Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}
oraRowPrimaryMap{fn3$ln3={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn$ln={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn1$ln1= {Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}}
# 1 楼答案
您只是对每一行重复使用相同的
oraRowDetailsMap
。难怪你在结果中反复出现同样的地图在结果集循环中使用
Map<...> oraRowDetailsMap = new HashMap<...>();
为每行创建一个新映射,而不是在循环之前只创建一次