removeAll原理?
老師在課程中將Course類寫成數組,并運用removeAll()方法去掉了List類型的對象coursesToSelect中的相同屬性的元素,于是我想,可不可以通過同樣為List類型的對象來代替這個數組達成刪除的目的,我首先實驗了以下代碼:
//第1個代碼
public static void main(String[] args) {
???? List clas = new ArrayList();
???? clas.add(new classes(1,"Miker"));
???? clas.add(new classes(2,"Chen"));
???? clas.add(new classes(3,"Joker"));
???? clas.add(new classes(4,"Li"));
????
???? List clas2 = new ArrayList();
???? clas2.add(new classes(3,"Joker"));
???? clas2.add(new classes(4,"Li"));
???? for(Object o:clas) {
???????? classes obj = (classes)o;
???????? System.out.println("id:"+obj.id+" name:"+obj.name);
???? }
????clas.removeAll(clas2);
???? for(Object o:clas) {
???????? classes obj = (classes)o;
???????? System.out.println("id:"+obj.id+" name:"+obj.name);
????}
}
我發現第2,3兩個元素并沒有被刪除,于是參考老師的方法直接從原List對象中get元素,
//第2個代碼
public static void main(String[] args) {
???? List clas = new ArrayList();
???? clas.add(new classes(1,"Miker"));
???? clas.add(new classes(2,"Chen"));
???? clas.add(new classes(3,"Joker"));
???? clas.add(new classes(4,"Li"));
????
???? List clas2 = new ArrayList();
???? clas2.add(clas.get(2));
???? clas2.add(clas.get(3));
???? for(Object o:clas) {
???????? classes obj = (classes)o;
???????? System.out.println("id:"+obj.id+" name:"+obj.name);
???? }
????clas.removeAll(clas2);
???? for(Object o:clas) {
???????? classes obj = (classes)o;
???????? System.out.println("id:"+obj.id+" name:"+obj.name);
????}
}
這樣就可以成功刪除了,請問這是因為什么呢?
2020-04-06
首先第1個代碼中的clas2中的元素其實與clas中的第3,4個元素只是值相同,他們的引用地址是不同的。因為clas2中的元素是重新申請內存空間,創建了"Joker"、“Li”。也就是說clas和clas2中只是有兩個值相同的元素。
第2個代碼成功的原因,其實由上述1可以知道。通過clas2.add(clas.get(2));添加的元素是與clas中元素的引用地址相同,因此能夠通過clas2刪除clas中的元素。