为什么 java.util.list 添加以前的数据,这些数据在添加新数据时被清除

why does java.util.list adds previous data which were cleared when adding new data

我创建了一个蜘蛛程序。

在向MySQL数据库中插入数据时出现了一些数据重复的问题。

比如程序插入A的数据时,先把A的字段的一些值插入数据库,再插入B的数据,再插入B。

在数据库中>>>>>

please click to check the exmple

B没有红色数据但仍然插入。 我在插入 B 之前清除了列表,但是它不起作用。

调试时:

插入A_list[A.size是45,list.size=45]

list.clear() [列表=空]

list=getB()

插入B_list[list.size=45+49=94][B.size是49]

为什么此时list的大小是94? 应该是49.list再次添加了A的数据。

这是我的代码:

private static void Insert(List<User> rootusers) throws Exception{
    String sql="insert into t_userlist(userid,username,rootuserid,rootusername,visited) values(?,?,?,?,?)";
    String sqlupdate="update t_userlist set visited=1 where userid=?";
    String sqlvisited="SELECT * from t_userlist where visited=1 and userid=";
    Connection conn=null;
    PreparedStatement psmt = null;
    PreparedStatement ps;
    for(int i=0;i<rootusers.size();i++){
        User user=rootusers.get(i);

        List<User> userlist=htmlParser.parseUserlist(user);

        if(userlist!=null){
            conn=DbUtil.getConn();
            conn.setAutoCommit(false);
            try {
                for(int j=0;j<userlist.size();j++){


                        int visitedUser=selectUserID(sqlvisited+"'"+userlist.get(j).getUserid()+"'").size();

                        psmt=conn.prepareStatement(sql);
                        psmt.setString(1, userlist.get(j).getUserid());
                        psmt.setString(2, userlist.get(j).getUsername());
                        psmt.setString(3, user.getUserid());
                        psmt.setString(4, user.getUsername());
                        if(visitedUser!=0){
                            psmt.setInt(5, 1);
                        }
                        else {
                            psmt.setInt(5, 0);
                        }
                        psmt.executeUpdate();
                        psmt.close();
                }


                ps=conn.prepareStatement(sqlupdate);
                ps.setString(1,user.getUserid());
                ps.executeUpdate();
                conn.commit();
                ps.close();
                DbUtil.closeConn(conn);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }catch (Exception e) {
                try {
                    if(conn!=null)
                    {
                          conn.rollback(); 
                         // conn.setAutoCommit( true);
                    }
                } catch (Exception e1) {

                    e1.printStackTrace();
                }
            }

            **userlist.clear();**
            System.out.println("insert"+user.getUsername()+"successfully");
        }else {
            continue;
        }

    }

}

htmlParser.parseUserlist(用户)代码:

public static ArrayList<User> parseUserlist(User user) throws Exception{
    String userlist=GetUserlist.getUserList(user.getUserid());//just return html 
    ArrayList<User> list=new ArrayList<User>();
    if(userlist!=null){
        Document doc=Jsoup.parse(userlist);
        Elements users=doc.select("a[usercard]");

        for(Element nodeuser:users){
            //System.out.println(nodeuser.toString());
            User u=new User();
            u.setUserid(nodeuser.attr("usercard").substring(3,13));
            u.setUsername(nodeuser.text());
            u.setRootuserid(user.getUserid());
            list.add(u);
            //System.out.println(u.getUserid()+" "+u.getUsername());
        }
    }else {
        System.out.println(user.getUsername()+"没有关注任何人");
    }

    //System.out.println(users.toString());
    //System.out.println(list.get(1).getUsername());
    return list;
}

请帮帮我!

在您提供的代码中,我没有发现任何会导致您出现问题的错误。需要知道的一件事是 list.Clear() 与 list = null; 不同。因为空列表是不包含任何元素的列表,而 clear() 会清空列表。在你的插入方法中,你会用 !userList.isEmpty() 做得更好(看看你如何总是创建一个列表,最坏的情况是从 parseUserList.

返回一个空列表