如何在以XML为数据库的Java聊天应用中更新用户Set集合?
问题定位
- 用户更新逻辑完全错误
你当前生效的用户更新代码写了双层循环:先遍历XML里的每个用户,再遍历内存里的每个用户,每次内层循环都调用一次add方法,相当于同一个XML用户会被尝试添加N次(N等于内存当前的用户数量),完全不符合预期。 - Set判断重复依赖equals和hashCode方法
你用Set存储用户列表,Set.add()方法判断对象是否已存在的逻辑是:先判断两个对象的hashCode是否相等,再调用equals方法校验,两个条件同时满足才会认为是同一个对象拒绝添加。如果你的User类没有正确重写这两个方法,要么会出现重复添加用户,要么会出现新用户加不进去的问题。同样你之前判断房间相等的room_ram.equals(room_xml)也依赖Room类的equals重写是否正确。 - 注释版本的代码逻辑也存在错误
你注释掉的单循环版本里加了else break,只要第一个XML用户已经存在于内存列表,就直接跳出循环,后续所有用户都不会处理,自然不会更新用户列表。
修复方案
- 首先确认
Room类和User类都正确重写了equals()和hashCode()方法,建议用业务唯一字段做判断:比如Room用房间ID判断相等,User用用户ID判断相等。
示例(手动重写User类的两个方法):@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(userId, user.userId); // 用用户唯一ID做判断 } @Override public int hashCode() { return Objects.hash(userId); } - 替换原来错误的用户更新代码,直接遍历XML的用户列表挨个添加即可,不需要嵌套遍历内存用户:
Set<User> us_xml = room_xml.getUserList(); Set<User> us_ram = room_ram.getUserList(); for (User u_xml : us_xml) { if (us_ram.add(u_xml)) { System.out.println("新用户添加成功:" + u_xml.getUserName()); } } - 如果存在用户退出需要删除的场景,你还需要加一步反向校验:遍历内存中的用户,判断是否还存在于XML的用户列表里,如果不存在就从内存删除,否则只会加人不会删人。
内容的提问来源于stack exchange,提问作者Varo95
相关产品推荐
相关产品推荐

