为什么removeAll()会删除所有相同的元素?

来源:4-8 学生选课—课程删除

weibo_爱你发自内心的微笑_0

2018-08-31 18:53

3:HTML

1:数据结构

2:C语言

4:数学

5:汇编语言英语

1:数据结构


修改后:--删除后的课程列表--

3:HTML

4:数学

5:汇编语言英语



这是我删除后控制台显示的,为什么我只让删除下表1和2的数据,却连下表5的元素也删除了。只是因为下表1和5的元素内容相同而已。我修改下表5的内容后再执行删除就没有问题。下面是代码:


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

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

System.out.println("--删除后的课程列表--");

testForeach();


写回答 关注

3回答

  • qq_Takeiteasy_2
    2018-12-30 16:46:18

    上面那个原因再补充一下,虽然它比较的是地址,但是用的不是 == ,用的equals方法,不要疑惑,因为集合里放的是对象的地址,不信你可以输出来看看,别重写Course的toString方法,然后用courseofselect.toString()方法输出。。所以上面我说的两种情况的结果是不一样的,这是我看ArrayList类里的removeAll方法得出的结论,如果我有哪地方说错了还望各位网友路过的话有时间的话指出,谢谢噻~(单词大小写的错误就不要指出了,主要我在自己电脑上写的时候写的courseofselect)

  • qq_Takeiteasy_2
    2018-12-30 11:41:44

    跟你添加到集合中的元素有关。

    如果你是这样添加的,Course c1 = new ("1","数据结构"); courseofselect.add(c1);courseofselect.add(c1);这样的话你删除就会把你所添加到集合中的值为数据结构这个Course对象都删除。因为你添加的是相同内存地址的对象,也就是一个对象。

    如果你是这样添加的,Course c1 = new ("1","数据结构");Course c2 = new ("1","数据结构"); courseofselect.add(c1);courseofselect.add(c2);这样你删除的话就只会删除你指定位置的元素。

    原因是,ArrayList对象的removeall方法删除元素,它内部调用的是batchRemove方法,利用的是元素的内存地址比较去删除元素。


  • weibo_爱你发自内心的微笑_0
    2018-08-31 18:55:04
    Course[] crs = { (Course) (coursesToSelect.get(2)), (Course) (coursesToSelect.get(1)) };
    coursesToSelect.removeAll(Arrays.asList(crs));
    
    System.out.println("--删除后的课程列表--");
    testForeach();


Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409792 学习 · 4340 问题

查看课程

相似问题