谁能告诉我为什么我的旧列表包含所有应该只存在于新列表中的值。?

Can anyone tell me why my old list has all the values which should be there only in the new list.?

  1. 我在 tmp 中存储一个列表,然后在列表中添加新值。
  2. 刷新时我正在比较旧列表和新列表。
  3. 如果新列表有新条目,则会生成通知,但每次我都在旧列表中找到所有值。

    public void populateList(String result) {
        ArrayList<User> tmp;
        tmp = list;
        list.clear();
        try {
            JSONArray jsonArray = new JSONArray(result);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject json_data = jsonArray.getJSONObject(i);
                String NAME = json_data.getString(StaticMember.NAME);
                String STATUS = json_data.getString(StaticMember.STATUS);
                list.add(new User(NAME, STATUS));
            }
            ArrayList tmpN = list;
            compare(tmp, tmpN);
            CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, list);
            lv.setAdapter((customAdapter));
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void compare(ArrayList list_old, ArrayList list_new) {
        try {
            Iterator<User> iterator_old = list_old.iterator();
            Iterator<User> iterator_new = list_new.iterator();
    
            while (iterator_new.hasNext()) {
                User user_new = iterator_new.next();
                boolean NEW = true;
    
                while (iterator_old.hasNext()) {
                    User user_old = iterator_old.next();
                    //Log.i(":N:"+user_new.getUsername(), ":O:"+user_old.getUsername());
                    if (user_new.getUsername().equals(user_old.getUsername())) {
                        NEW = false;
                        break;
                    }
                }
                if (NEW) {
                    generateNotification(getApplicationContext(), user_new.getUsername() + " has been added.");
                    Log.i("True", "Changed");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

当您执行 tmp = list 时,您不会将 list 的值存储在 tmp 中。相反,您只需让 tmp 引用与 list 引用相同的对象。以后修改list时,修改tmp引用的内容。

最初,list 引用用户列表:

 list -> [user0, user1, user2]

tmp = list之后,listtmp都引用同一个列表:

 list -> [user0, user1, user2] <- tmp

当你调用list.clear()时,你清除了原来的列表:

 list -> [] <- tmp

并且当您向 list 添加新元素时,您修改了原始列表:

 list -> [newuser0] <- tmp

如果您需要在 tmp 中存储 list 的副本,您需要在修改旧列表之前创建一个新列表:

List<User> tmp = new ArrayList<>(list);

请注意,存储在两个列表中的 User 对象仍然相同,因此如果您修改一个列表中的对象,它将反映在另一个列表中。