HashMap在执行put后,key不相同,但前面的键被覆盖了

hong_fang 2006-05-17 03:16:25
是从数据库中查出记录,然后存到一个HashMap组成的List中,数据库字段是不可能重复的,但是通过断点跟踪发现,某些前面取出的键被覆盖了,代码如下:
public static List executeQuery(String sql) throws Exception {
System.out.println(sql);
List rsall = new ArrayList();
Connection con = connectToDb();
Statement stmt = null;
ResultSet rs = null;
Map rsTree;
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
while (rs.next()) {
rsTree = new HashMap(numberOfColumns);
for (int r = 1; r < numberOfColumns + 1; r++) {
rsTree.put(rsmd.getColumnName(r).toLowerCase(), rs.getObject(r)); }
rsall.add(rsTree);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return rsall;

}
...全文
1386 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluemike 2006-05-17
  • 打赏
  • 举报
回复
每次rs.next()列名是相同的,也就是key相同前面的就被覆盖了
crazycy 2006-05-17
  • 打赏
  • 举报
回复
搂主大意了

问题是这样的:

table的每一项下还有个next hashmap hashtable都是有个hash算法 如果hash值一致 就占用一个位置 只是用一个链接连接了起来

不是么~
believefym 2006-05-17
  • 打赏
  • 举报
回复
肯定是楼主自己的问题,查吧
harston 2006-05-17
  • 打赏
  • 举报
回复
今天咋尽出歪主意阿,呵呵,
你的sql语句是什么啊?
hong_fang 2006-05-17
  • 打赏
  • 举报
回复
harston()
“如果列名相同的话肯定会被覆盖了阿”
列名是不同的,而且这个函数原来使用没有问题,今天突然发现有些列取不到数据
harston 2006-05-17
  • 打赏
  • 举报
回复
不好意思我看错了!rsTree.put(rsmd.getColumnName(r).toLowerCase(), rs.getObject(r));是不是因为rsmd.getColumnName(r)获取的是列名而不是数据的原因哦,如果列名相同的话肯定会被覆盖了阿,你调试的时候看看这个数据是不是每次都一样三
hong_fang 2006-05-17
  • 打赏
  • 举报
回复
harston() ,我是跟踪看的,没有退出while循环,在for循环的时候,前5项都没有问题,但是在第六项执行put时,前5项中的某一项被覆盖了
hong_fang 2006-05-17
  • 打赏
  • 举报
回复
是的,我从debug中看那个HashMap对象中的size,table属性,
size等于7,但table只有5项有内容,跟踪发现,前面的某些项被覆盖了
harston 2006-05-17
  • 打赏
  • 举报
回复
while (rs.next()) {
rsTree = new HashMap(numberOfColumns);
for (int r = 1; r < numberOfColumns + 1; r++) {
rsTree.put(rsmd.getColumnName(r).toLowerCase(), rs.getObject(r)); }
rsall.add(rsTree);
}
lz每次循环的时候rsTree = new HashMap(numberOfColumns);new了一个新的hashMap,等你循环出来肯定没有前面的数据啦!
believefym 2006-05-17
  • 打赏
  • 举报
回复
某些前面取出的键被覆盖了?
怎么个覆盖法,字段名不可能重复,楼主的意思是之前存的k-v对存在丢失?

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧