Advanced   Java   Services
Die Methoden addAll, removeAll und retainAll
Back Next Up Home

Die Methoden addAll, removeAll und retainAll verhalten sich unterschiedlich, je nachdem zu welchem Objekt sie gerufen werden. Wichtig dabei ist, ob die zugehörige Klasse das List oder das Set-Interface implementiert hat.

Die folgende Tabelle beschreibt das Verhalten der Methoden.

Collection col;
List list;
Set set;
 
list.addAll(col)fügt alle Elemente von col ans ende von list (auch wenn sie schon vorhanden sind)
set.addAll(col)nimmt nur die Elemente von col in set auf, die nicht schon vorhanden sind (Mengenvereinigung)
list.removeAll(col)entfernt alle Elemente von list, die in col stehen (kommt das Element in list mehrmals vor, werden alle Exemplare entfernt)
set.removeAll(col)entfernt alle Elemente von set, die in col stehen (auch wenn ein Element in col mehrmals vorkommt, kann es aus set nur einmal entfernt werden)
list.retainAll(col)Bildet die "Schnittmenge" von list und col in dem Sinne, daß in list nur diejenigen Elemente bleiben, die auch in col sind. Treten diese Elemente in list mehrfach auf, so bleibt ihre Vielfachheit erhalten.
set.retainAll(col)Bildet die "Schnittmenge" von set und col in dem Sinne, daß in set nur diejenigen Elemente bleiben, die auch in col sind. Dabei ist es egal, wie oft diese Elemente in col auftreten.


Das folgende Programm demonstriert dieses Verhalten an einem kleinen Beispiel.


import java.util.*;

public class CollectionDemo
{

   public static void main(String args[])
   {
      ArrayList al = new ArrayList();

      for(int i=0; i<5; i++)
         al.add( new Integer(i) );

      for(int i=0; i<5; i++)
         al.add( new Integer(i) );

      int len = al.size();
      System.out.println(" al ---------------------------");
      for(int i=0; i<len; i++)
         System.out.println( al.get(i) );
      // Inhalt von al :  0  1  2  3  4  0  1  2  3  4


      HashSet hs = new HashSet(al);
      Iterator it = hs.iterator();
      System.out.println("hs ---------------------------");
      while(it.hasNext())
         System.out.println(it.next());
      // Inhalt von hs :  0  1  2  3  4


      al.addAll(hs) ;
      len = al.size();
      System.out.println("al.addAll(hs) ---------------------------");
      for(int i=0; i<len; i++)
         System.out.println( al.get(i) );
      // Inhalt von al :  0  1  2  3  4  0  1  2  3  4  4  3  2  1  0


      hs.addAll(al) ;
      it = hs.iterator();
      System.out.println("hs.addAll(al) ---------------------------");
      while(it.hasNext())
         System.out.println(it.next());
      // Inhalt von hs :  0  1  2  3  4


      HashSet hs2 = new HashSet();
      hs2.add( new Integer(1));
      hs2.add( new Integer(3));
      // Inhalt von hs2 :  1  3

      al.removeAll(hs2) ;  // entfernt alle 1-en und 3-en
      len = al.size();
      System.out.println("al.remove(hs2) ---------------------------");
      for(int i=0; i<len; i++)
         System.out.println( al.get(i) );
      // Inhalt von al :  0  2  4  0  2  4  4  2  0


      hs.removeAll(al) ;
      it = hs.iterator();
      System.out.println("hs.removeAll(al) ---------------------------");
      while(it.hasNext())
         System.out.println(it.next());
      // Inhalt von hs :  1  3

      al.add(new Integer(1));
      al.add(new Integer(1));
      // Inhalt von al :  0  2  4  0  2  4  4  2  0  1  1

      hs2.add( new Integer(4));
      // Inhalt von hs2 :  1  3  4

      al.retainAll(hs2) ;  // "Schnittmenge" von al und hs2
      len = al.size();
      System.out.println("al.retain(hs2) ---------------------------");
      for(int i=0; i<len; i++)
         System.out.println( al.get(i) );
      // Inhalt von al :  4  4  4  1  1

      hs2.retainAll(al);  // "Schnittmenge" von hs2 und al
      it = hs2.iterator();
      System.out.println("hs2.retainAll(al) ---------------------------");
      while(it.hasNext())
         System.out.println(it.next());
      // Inhalt von hs :  4  1

   } // ende main

}  // end class

top Back Next Up Home