问答详情
源自:4-8 学生选课—课程删除

removeAll()方法问题

课程中讲到removeAll方法的用途如下

Course[] crToRemove = {(Course)coursesToSelect.get(1),(Course)coursesToSelect.get(2)};

coursesToSelect.removeAll(Arrays.asList(crToRemove));

如果我把(Course)coursesToSelect.get(1)换成一个Course对象还能不能删除对应数据呢?像下面这样(方式2)

Course[] crToRemove = {new Course(2, "C语言"),new Course(3, "数学")};

coursesToSelect.removeAll(Arrays.asList(crToRemove));

我测试了一下,没有删除,是因为方式2中的new Course(2, "C语言")重新声明了一个对象,跟List中的对象不一样吗?

提问者:迷茫的土拨鼠 2017-11-08 08:05

个回答

  • 油菜花的人
    2017-11-08 09:42:07
    已采纳

    我也是新手,个人见解,如有错误请见谅。

    Course[] crToRemove = {(Course)coursesToSelect.get(1),(Course)coursesToSelect.get(2)};

    就相当于根据索引get到了两个值,放在了数组中。然后直接移除两个值。

    Course[] crToRemove = {new Course(2, "C语言"),new Course(3, "数学")};

    这一步做添加操作的时候就会做,是新声明两个元素,然后add到集合中。 这里要注意的是 2,3 并不是集合的索引,而是你添加的元素,替换成“任意值”也是一个性质。 所以你remove的时候没有得到索引,根本无法执行删除操作。


  • 慕粉3380826
    2018-07-08 10:45:17

    是这样的:

    Course[] crToRemove = {(Course)coursesToSelect.get(1),(Course)coursesToSelect.get(2)};

    coursesToSelect.removeAll(Arrays.asList(crToRemove));

    这种方法是从集合中获取到之前添加的对象放到数组中,然后统一删除从集合中获取到的所有数据,能删除没问题;

    Course[] crToRemove = {new Course(2, "C语言"),new Course(3, "数学")};

    coursesToSelect.removeAll(Arrays.asList(crToRemove));

    这种方式,是新创建两个对象(这两个新创建的对象和之前的已经在集合中添加过相同id和相同名字的对象,不能看做是同一个对象,最起码两者内存地址是不相同的),新创建的两个对象并不存在集合中,所以删除失;

    理解下面代码你就明白了:

    Course a=new Course(2, "C语言");

    Course b=new Course(2, "C语言");

    a和b虽然属性id和name相同,却是不同的对象(堆内存中的位置不同),a放入集合中,然后在集合中移出b,肯定失败,因为集合中根本没有存放b;如果集合中同时放入a和b,两者索引也不会相同;



  • 迷茫的土拨鼠
    2017-11-08 21:22:57

    嗯嗯,是这样的,无论是对象还是索引值都是不同的,积分拿去