removeAll原理?
老師在課程中將Course類寫成數(shù)組,并運(yùn)用removeAll()方法去掉了List類型的對(duì)象coursesToSelect中的相同屬性的元素,于是我想,可不可以通過同樣為List類型的對(duì)象來代替這個(gè)數(shù)組達(dá)成刪除的目的,我首先實(shí)驗(yàn)了以下代碼:
//第1個(gè)代碼
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);
????}
}
我發(fā)現(xiàn)第2,3兩個(gè)元素并沒有被刪除,于是參考老師的方法直接從原List對(duì)象中g(shù)et元素,
//第2個(gè)代碼
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);
????}
}
這樣就可以成功刪除了,請(qǐng)問這是因?yàn)槭裁茨兀?br />
2020-04-06
首先第1個(gè)代碼中的clas2中的元素其實(shí)與clas中的第3,4個(gè)元素只是值相同,他們的引用地址是不同的。因?yàn)閏las2中的元素是重新申請(qǐng)內(nèi)存空間,創(chuàng)建了"Joker"、“Li”。也就是說clas和clas2中只是有兩個(gè)值相同的元素。
第2個(gè)代碼成功的原因,其實(shí)由上述1可以知道。通過clas2.add(clas.get(2));添加的元素是與clas中元素的引用地址相同,因此能夠通過clas2刪除clas中的元素。