Java集合类总结 (一)

集合类中的基本接口php

集合类中最基础的接口是Collection:css

public interface Collection<E>
{
    boolean add(E element);
    Iterator<E> iterator();
}

add方法加一个元素到集合中,若是改变了集合则返回true,若是集合未改变则返回false。例如,若是试图向set中加入一个已经存在其中的对象是,此add接口将返回false,由于set不容许加入重复的对象,故你没有改变集合。html

 

iterator方法返回用来遍历集合的对象,其实现了接口Iterator,看一下Iterator的定义:java

public interface Iterator<E>
{
    E next();
    boolean hasNext();
    void remove();
}

 

“for each”语法能够用于全部实现了Iterable接口的对象,其Iterable接口也只是包括了一个返回实现了Iterator对象的方法:node

public interface Iterable<E>
{
    Iterator<E> iterator();
}

Collection接口扩展了Iterable接口,因此全部Collection均可以使用for each语法遍历。nginx

 

Iterator接口方法介绍

关于Iterator接口的next方法,当你调用一次next方法后,Iterator会跳到下一个元素的后面,并返回所跳过元素的引用,以下图:
git

关于Iterator接口的remove方法,它会移除上一次调用next所返回的元素,也就是会移除刚刚Iterator跳过的那个元素。github

移除collection中首个元素:web

Iterator<String> it = c.iterator();
it.next(); //Skip over the first element
it.remove(); // now remove it

 

可见,next与remove方法是有依赖关系的。若是从没有调用next就直接调用remove方法,那就是非法操做,并会抛出IllegalStateException异常。
而且连续调用两次remove,第二次调用也是非法的:ajax

it.remove();
it.remove(); //ERROR!!

你必须在每一次调用remove以前调用next:

it.remove();
it.next();
it.remove(); // OK

 

实现本身的collection类

因为Collection接口定义了不少的方法,若是本身要实现它,会重复作不少工做,Java类库准备了不少的抽象类,这些类实现了Collection接口,并实现了部分经常使用的公用的方法,因此当你去实现本身的collection类时,不须要再去从新造轮子了,只须要继承这些抽象类,并覆盖那些你须要自定义的方法便可。

public abstract class AbstractCollection<E> implements Collection<E>
{
   . . .
       public abstract Iterator<E> iterator();
       public boolean contains(Object obj)
       {
          for (E element : this) // calls iterator()         
          {    
            if (element.equals(obj))
                return = true;
          }
           return false;
       }
   . . .
}

如上面的抽象类实现了经常使用方法contains。