java -list集合 removeAll 移除 對象 -重寫實體equals方法


前提:

在項目中需要實現一個活動未參與人名單的篩選,一開始使用的list的泛型是String 可以把參與人員在全體的list集合中篩選出來。由於后期需要篩選多個字段,所以把list集合泛型換成了實體所以就無法進行篩選。

原因

removeAll方法,是遍歷調用remove方法進行刪除的。在刪除之前,判斷了此集合元素里的內容是否包含在全部人員列表的隊列中

removeAll源碼

 public boolean removeAll(Collection<?> c) {
        Objects.requireNonNull(c);
        boolean modified = false;
        Iterator<?> it = iterator();
        while (it.hasNext()) {
            if (c.contains(it.next())) {
                it.remove();
                modified = true;
            }
        }
        return modified;
    }

自己的實現方式

  //遍歷參與人員名單,從全部人名單中去除
            for (StudentModel object : objects) {
                for (StudentModel studentModel : allUserName) {
                    if(studentModel.getPersonName().equals(object.getPersonName())){
                        allUserName.remove(studentModel);
                        break;
                    }
                }
            }

可以明顯看出來自己寫的使用了循環嵌套,效率上肯定不如removeAll的迭代器 while 單層循環的效率高

解放方案:

重寫實體類的equals 方法

    private String personID;
    private String personName;
    private Integer id;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StudentModel that = (StudentModel) o;
        return   Objects.equals(personName, that.personName);
    }

注意事項
重寫equals方法的時候,根據實際使用的實體字段去重寫equals方法
里的對比字段
此處是坑
我這次就是實體里有兩個字段,但是只有一個字段里有值。所以直接默認重寫equals方法不修改是無法移除的
如下
默認重寫equals

  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StudentModel that = (StudentModel) o;
        return Objects.equals(personID, that.personID) && Objects.equals(personName, that.personName);
    }

根據實際情況重寫equals

  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StudentModel that = (StudentModel) o;
        return  Objects.equals(personName, that.personName);
    }

比如我這個有兩個字段,但是只有一個字段有值。所以equals里值對比一下一個pseronName


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM