CoreJava读书笔记--集合(一)--Java集合框架

Java集合框架

(一)将集合的接口与实现分离

事实上,Java的集合类库也是将接口与实现分离的。这句话的意思就是:集合会定义接口,然后再实现接口。我们举个例子,看看对列Queue是如何接口与实现分离的。

队列接口指出可以在队列尾部添加元素,队列头部删除元素,并且可以查找队列元素的个数。那么,我们可以把队列接口用下面简单的形式表现出来:

public interface Queue<E>
{
    public add(E element);
    public E remove();
    public int size();
}

这个接口并没有说明是如何实现的,队列通常有两种实现方式:一、循环数组,二、链表

假设队列的两种实现是如下代码:

public class CircularArrayQueue<E> implements Queue<E>
{
    private int head;
    private int tail;
    
    CircularArrayQueue(int capacity){...}
    public void add(E element){...}
    public E remove(){...}
    public int size(){...}
}


public class LinkedListQueue<E> implements Queue<E>
{
    private Link head;
    private Link tail;

    LinkedListQueue(){...}
    public viod add(E element){...}
    public E remove(){...}
    public int size(){...}
}

其实我们不必知道队列使用的是那种实现,只有我们在构建集合对象时,使用具体的类才有意义。还有一点需要说明的是:我们可以使用接口类型存放集合的引用。

Queue<Customer> cus = new CircularArrayQueue<>(100);

//利用这种方式的好处,就是一旦我们需要使用其他实现方式,我们只需要修改调用的构造器即可

Queue<Customer> cus = new LinkedListQueue<>(100);

(二)Collection接口

在Java类库中,集合类的基本接口是Collection接口,这个接口有两个常见的方法:

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

add方法用于向集合中添加元素,如果添加元素确实改变了集合,就返回true,否则false;

iterator方法用于返回一个实现了Iterator接口的对象,可以使用这个迭代器依次访问集合中的元素。

(三)迭代器

Iterator接口有4个方法:

public interface Iterator<E>
{
    E next();
    boolean hasNext();
    void remove();
    default void forEachRemaining(Cosumer<? super E> action);
}

通过循环,反复调用next方法,可以逐个访问集合中的每个元素。但是如果到达了集合末尾,next方法将抛出一个NoSuchElementException异常,因此在调用next方法之前需要调用hasNext方法进行判断。

Collection<Stirng> c = ...;
Iterator<String> it = c.iterator();
while(it.hasNext()){
    String element = it.next();
    do something with element
}

也可以使用for-each循环遍历集合元素:

for(String element : c){
    do something with element
}

在Java8中,甚至不用写循环,可以调用forEachRemaining方法并提供一个lambda表达式,将对迭代器的每一个元素调用这个表达式,直到没有元素为止。

iterator.forEachRemaining(element->do something with element);

还有一个方法是remove方法,它将删除上次next方法返回的元素。更重要的是,next方法和remove方法具有相互依赖性,如果调用remove方法之前没有调用next方法,那么将会抛出一个IllegalStateException异常。比如要删除两个相邻的元素:

it.remove();
it.next();//这非常重要,否则会抛出异常
it.remove();

(四)泛型实用方法

由于Collection和Iterator都是泛型接口,所以可以编写操作任何集合类型的实用方法,例如contains方法,Java类库设计者认为,这些实用方法中的某些方法非常有用,应该将它们提供给类库的使用者,这样类库使用者就不必再重新构建这些实用方法了。

事实上,Collection接口声明了很多方法,所有的实现类都必须提供这些方法,可看API,如果每个使用者都要提供这么多方法,那就太麻烦了。所以Java类库又为我们提供了一个实现了某些实用方法的抽象类AbstractCollection,这些实用方法已经在这个抽象类中帮我们实现了,除非针对你的需求,你有更高效的处理方式,你可以重写该方法。

 (五)集合框架中的接口

Java中集合主要有两个接口,Collection和Map,如下图:

下一节我们看看具体的集合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值