Collection 中带有All结尾的常用方法:addAll(),removeAll(),containsAll(),retainAll() 。

Collection中带有All的方法: 

                                                       Collection list1 = new ArrayList(); 

                                                       Collection list2 = new ArrayList(); 

1. addAll():list1.addAll( list2 );  这句话的意思是:将list2集合中的所有的元素都一个个的添加进list1中。这样改变了list1的元素组成,但是没有改变list2的元素组成。

2. removeAll(): list1.remove(list2) ;  这句话的意思是:list1集合与list2集合 先  找到 交集,然后 在 list1中删除 交集 ,然后将删除交集后的list1重新赋给list1,list2中的元素不变,然后打印list1,这样就会输出 删除交集后的 list1 。 removeAll删除的是 两个集合的交集 。 

3. containsAll(): boolean flag = list1.containAlls(list2) ;  查看 list1中是否包含所有的list2中的元素,如果 list1 集合中 包含所有 的 list2集合中所有的元素,那么就返回 true ,否则返回 false 。

4. retainAll():  boolean flag = list1.retainAll(list2) ;  list1 和 list2 两个集合 先取 交集 。 然后 将交集 赋给 list1 , 如果 list1集合元素组成发生了变化,那么就返回 true , 否则返回 false 。特殊情况: list1 和 list2 两个集合 完全相同,所以 list1 和list2 的交集 就是他们 本身, 把交集 赋给 list1时 ,list1 没有发生任何的变化,所以返回 false 。综上所述:retainAll()中 只要list1发生变化,就返回 true,不发生变化就返回false 。

示例代码如下:

import java.util.ArrayList;

import java.util.Collection;


public class Main {


@SuppressWarnings("unchecked")
public static void main(String[] args) {
/*
@SuppressWarnings("rawtypes")
Collection c1 = new ArrayList() ;
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
@SuppressWarnings("rawtypes")
Collection c2 = new ArrayList() ; 
c2.add("e");
c2.add("f");
boolean flag1 = c1.addAll(c2);
System.out.println(flag1); //true。 
System.out.println(c1); // 输出结果为:[a,b,c,d,e,f]
//addAll()将c2中的所有的元素都一个个的添加进了c1中。
System.out.println(c2);//输出结果为:[e,f]。
//addAll的原理是: 将 c2的元素添加进c1中,然后改变c1中的元素组成,但是不改变c2的元素组成。

*/

Collection c1 = new ArrayList() ;
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
@SuppressWarnings("rawtypes")
Collection c2 = new ArrayList() ; 
c2.add("e");
c2.add("f");

c1.add(c2);
System.out.println(c1);//输出结果为: [a, b, c, d, [e, f]]
//addAll() 与 add() 之间的区别: 
/*
* addAll():是将c2中的元素一个个加入到c1中,改变c1的组成。 
* add():是将c2看作一个整体,然后将c2整体添加到c1中,然后改变c1的组成。
* */




  Collection c3 = new ArrayList() ; 
  c3.add("a"); 
  c3.add("b"); 
  c3.add("c"); 
  c3.add("d");
  Collection c4 = new ArrayList() ; 
  c4.add("a"); 
  c4.add("b"); 
  boolean flag2 = c3.removeAll(c4); 
  System.out.println(flag2);//结果:true
  System.out.println(c3); //[c,d]  
  System.out.println(c4); //[a,b]
  //由上面可知: removeAll()的作用原理:先找到 c3 和 c4 的交集,然后在c3中删除交集,c4里面的元素保持不变。
  //删除的是交集。 

  Collection c6 = new ArrayList() ; 
  c6.add("a");
  c6.add("b");
  c6.add("c"); 
  c6.add("d");
  Collection c7 = new ArrayList() ; 
  c6.add("a");
  c6.add("b");
  boolean flag3 = c6.containsAll(c7) ; //判断c6中是否包含了c7(包含了:c7的所有的元素 ,c6 都必须拥有)。 
  System.out.println(flag3); //结果 : true。
  System.out.println(c6); //[a, b, c, d, a, b] 其实也改变了 c6调用者的组成。但是这个方法不用想太多。
 /*
  Collection c8 = new ArrayList() ; 
  c8.add("a");
  c8.add("b");
  c8.add("z"); 
  boolean flag4 = c6.containsAll(c8); 
  System.out.println(flag4);//结果为: false 。 因为c6中不包括 “z” 这个元素。
  System.out.println(c6);
  */
  Collection c9 = new ArrayList(); 
  c9.add("a");
  c9.add("b");
  c9.add("c");
  c9.add("d");
  Collection c10 = new ArrayList();
  c10.add("c");
  c10.add("a");
  c10.add("z");
  boolean flag5 = c9.retainAll(c10);
  System.out.println(flag5);//true
  System.out.println(c9);//[a,c]。 之前的c9集合 元素组成是: [a,b,c,d]

  //retainAll() :c9和c10取交集,然后将交集赋给c9。这时候c9 被改变了。

 

 //没有交集,但是改变了调用者集合(c11)的元素组成,所以返回true。 

          Collection c11 = new ArrayList(); 
  c11.add("a");
  c11.add("b");
  c11.add("c");
  c11.add("d");
  Collection c12 = new ArrayList();
  c12.add("z");
  boolean flag6 = c11.retainAll(c12);//保留交集
  System.out.println(flag6);//true
  System.out.println(c11);//[ ]。没有交集,但是还是返回 true

  
  //出现的问题有:有交集返回true,没有交集返回ture。
  //什么情况下返回true,什么情况下返回false?
  //改变 调用者元素组成 返回 true,不改变 调用者的 元素组成 就 返回false 。

  
  //false 的情况: 
  Collection c13 = new ArrayList(); 
  c13.add("a");
  c13.add("b");
  c13.add("c");
  c13.add("d");
  Collection c14 = new ArrayList();
  c14.add("a");
  c14.add("b");
  c14.add("c");
  c14.add("d");
  boolean flag7 = c13.retainAll(c14);
  System.out.println(flag7); // 结果为: false  ;
  System.out.println(c13); // 交集为: [a,b,c,d] ;  
  //没有改变 调用者 c13的 元素组成。
  

  //综上所述: retainAll() : 改变 调用者的集合(元素组成) 就返回true,否则是返回false。不管有没有交集。

            //重点:只要改变调用者集合的元素组成,不管有没有交集,都返回true,否则返回false 。

}


}

猜你喜欢

转载自blog.csdn.net/Ameir_yang/article/details/80847945