1 retainAll方法示例
如何判断一个集合与另外一个集合中有相同的元素
例如A.retainAll(B);
如果AB中有相同的元素,那么A中会保留相同的元素,将不同的元素移除
如果AB中没有相同的元素,那么会返回[]
当A中的元素有变化时会返回true,没有变化会返回false
@Testpublic 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来打断点示例下
@Testpublic 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中的集合长度没有变化。