Collection represents a group of objects known as its elements. The
Collection interface is used to pass around collections of
objects where maximum generality is desired.  For example, by convention all
general-purpose collection implementations have a constructor that takes a
Collection argument.
This constructor, known as a conversion constructor, initializes the new
collection to contain all of the elements in the specified collection,
whatever the given collection's subinterface or implementation type.
In other words, it allows you to convert the collection's type.
Suppose, for example, that you have a Collection<String> c,
which may be a List, a Set, or another kind of
Collection. This idiom creates a new ArrayList
(an implementation of the List interface), initially
containing all the elements in c.
List<String> list = new ArrayList<String>(c);
Collection interface.
public interface Collection<E> extends Iterable<E> {
    // Basic operations
    int size();
    boolean isEmpty();
    boolean contains(Object element);
    boolean add(E element);         //optional
    boolean remove(Object element); //optional
    Iterator<E> iterator();
    // Bulk operations
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c); //optional
    boolean removeAll(Collection<?> c);        //optional
    boolean retainAll(Collection<?> c);        //optional
    void clear();                              //optional
    // Array operations
    Object[] toArray();
    <T> T[] toArray(T[] a);
}
Collection represents a group of objects.  The
interface has methods to tell
you how many elements are in the collection (size,
isEmpty), to check whether a given object is in the collection
(contains), to add and remove an element from the collection
(add, remove), and to provide an iterator over the
collection (iterator).
The add method is defined generally enough so that it makes sense
for collections that allow duplicates as well as those that don't.  It
guarantees that the Collection will contain the specified element
after the call completes, and returns true if the
Collection changes as a result of the call.  Similarly, the
remove method is designed to remove a single instance of
the specified element from the Collection,
assuming that it contains the
element to start with, and to return true if the
Collection was modified as a result.
for-each construct
and (2) by using Iterators.
for-each construct allows you to concisely traverse a collection or array using a for loop — see
The for Statement.
The following code uses the for-each construct to print out each
element of a collection on a separate line.
for (Object o : collection)
    System.out.println(o);
Iterator is an object that enables you to traverse through a collection and
to remove elements from the collection selectively, if desired. You get an
Iterator for a collection by calling its
iterator method. The following is the Iterator interface.
public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional
}
hasNext method returns true if the iteration has more elements, and the next method returns the next element in the iteration. The remove method removes the last element that was returned by next from the underlying Collection. The remove method may be called only
once per call to next and throws an exception if this rule is
violated.
Note that Iterator.remove is the only safe way to modify a
collection during iteration; the behavior is unspecified if the underlying
collection is modified in any other way while the iteration is in progress.
Use Iterator instead of the for-each construct when you need to:
for-each construct hides the
iterator, so you cannot call remove. Therefore, the for-each construct is not
usable for filtering.
Iterator to filter an
arbitrary Collection — that is, traverse the collection
removing specific elements.
static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}
Collection regardless of implementation. This example
demonstrates how easy it is to write a polymorphic algorithm using the Java
Collections Framework.
Collection.  You could implement these shorthand
operations using the basic operations, though in most cases such
implementations would be less efficient. The following are the bulk operations:
containsAll — returns true
if the target Collection contains all of the elements in the
specified Collection.
addAll — adds all of the elements in the specified
Collection to the target Collection.
removeAll — removes from the target
Collection all of its elements that are also
contained in the specified Collection.
retainAll — removes from the target
Collection all its elements that are not also contained
in the specified Collection.  That is, it retains only those elements in the target Collection that are also contained
in the specified Collection.
clear — removes all elements from the
Collection.
addAll, removeAll, and retainAll
methods all return true if the target Collection was
modified in the process of executing the operation.
As a simple example of the power of bulk operations, consider the
following idiom to remove all instances of a specified element,
e, from a Collection, c.
c.removeAll(Collections.singleton(e));
null elements from a Collection.
c.removeAll(Collections.singleton(null));
Collections.singleton, which is a static
factory method that returns an immutable Set containing only the
specified element.
toArray methods are provided as a bridge between
collections and older APIs that expect arrays on input.  The array operations allow the
contents of a Collection to be translated into an array.  The
simple form with no arguments creates a new array of Object.  The
more complex form allows the caller to provide an array or to choose the
runtime type of the output array.
For example, suppose that c is a Collection.
The following snippet dumps the contents of c into a newly
allocated array of Object whose length is identical to the number
of elements in c.
Object[] a = c.toArray();
c is known to contain only strings (perhaps because
c is of type Collection<String>). The following
snippet dumps the contents of c into a newly allocated array of
String whose length is identical to the number of elements in
c.
String[] a = c.toArray(new String[0]);