Java取交集方法retainAll()
1 retainAll方法示例
如何判断一个集合与另外一个集合中有相同的元素
例如A.retainAll(B);
如果AB中有相同的元素,那么A中会保留相同的元素,将不同的元素移除
如果AB中没有相同的元素,那么会返回[]
当A中的元素有变化时会返回true,没有变化会返回false
@Test public void test6(){ List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); for (int i = 0; i < 20; i++) { list1.add(i); if (i%2 == 0 ){ list2.add(i); } } System.out.println(list1); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] System.out.println(list2); //[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] list1.retainAll(list2); System.out.println(list1); //[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] }
结果:
2 源码解析
为了更好的解析源码,我们写一个简单的demo来打断点示例下
@Test public void test6(){ List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); list1.add(1); list1.add(2); list2.add(2); list1.retainAll(list2); System.out.println(list1); //2 }
boolean batchRemove(Collection<?> c, boolean complement, int from, int end) { Objects.requireNonNull(c); //获取list2的值 Object[] es = this.elementData; // 获取源数据list1中的值 for(int r = from; r != end; ++r) { //循环判断list2中是否包含list1的元素,将相同的元素放入list1数组中 if (c.contains(es[r]) != complement) { int w = r++; try { for(; r < end; ++r) { Object e; if (c.contains(e = es[r]) == complement) { es[w++] = e; } } } catch (Throwable var12) { System.arraycopy(es, r, es, w, end - r); w += end - r; throw var12; } finally { this.modCount += end - w; this.shiftTailOverGap(es, w, end); } return true; } } return false; }
源码看了一半,实在看不下去了,等之后有机会在补充吧
注意:我们不能根据判断返回的结果来判断二者集合是否有交集,应该判断list1中的长度是否有变化来判断,例如:
我们list1和list2中元素个数相同,并且有交集,但是其返回却是false。因为list1中的集合长度没有变化。
下一篇:
Java初学:接口的定义与实现