集合接口

集合接口_第1张图片

长城不是一天修建的,JDK也是。

集合最初也是使用了顶层设计的思路,java最初版本知识为最常用的数据结构提供了很少的一组类:
Vector、Stack、Hashtable、BitSet与Enumeration接口。
其中Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制。

将集合的接口与实现分离

以人们熟悉的数据结构–队列–queue为例,看下是如何分离的。
集合接口_第2张图片
队列接口之处可以在队列尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数。
当需要收集对象,并按照先进先出的规则检索对象时就应该使用队列。

队列很常见,业务场景发送代码,短信,email,定时任务都会到队列概念。

用空间换时间,为了为服务减压,会先把海量待处理任务扔到队列中,动态服务有空来分批处理。

队列通常实现由两种方式:

  • 循环数组
  • 链表

循环数组属于有界集合,好处是比链表更高效。

  public static void main(String[] args) {
    Queue queue = new ArrayDeque();
    for (int i = 0; i <100 ; i++) {
      queue.add(i);
    }

    for (int i = 0; i <100 ; i++) {
      System.out.println(queue.poll());
    }

  }

java类库中的集合接口和迭代器接口

在Java类库中,集合类的基本接口是Collection接口。
其中有两个基本方法add和iterator。

Iterator<E> iterator();
boolean add(E e);

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

迭代器

public interface Iterator<E> {

    boolean hasNext();


    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

迭代器这个接口包含了三个核心方法,也比较简单:

  public static void main(String[] args) {
    Queue queue = new ArrayDeque();

    for (int i = 0; i <100 ; i++) {
      queue.add(i);
    }
    Iterator<ArrayDeque> it = queue.iterator();
    while(it.hasNext()){
      it.next();
      System.out.println(it.next());
    }

  }

以上可以把队列数据遍历出来。

当然现在迭代器遍历数据比较少用,因为大家习惯优雅的使用foreach,只是为了说明集合中有迭代器这个对象,这是一个操作数据结构的中间工具。

至于访问集合的顺序是按照集合的特性来了,如果是hash相关的都是随机的。

删除元素

迭代器要深入理解,它流的概念比较类似read表示消耗掉,这个也是。
先消耗掉才能删除。

  public static void main(String[] args) {
    Queue queue = new ArrayDeque();

    for (int i = 0; i <10 ; i++) {
      queue.add(i);
    }
    Iterator<ArrayDeque> it = queue.iterator();
    while(it.hasNext()){
      System.out.println("元素个数:"+queue.size());
      System.out.println("要移除的元素:"+it.next());
      it.remove();

      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }

  }

泛型使用方法

泛型在JDK中可以看出几乎是为集合量身打造的工具。

Collection和Iterator都是泛型接口,可以编写操作任何集合类型的使用方法。

他们肯定了很多实用性的方法,而对于业务开发人员来说基本只是用接口做多态,数据类型定义。

如果扩展开发就会有点烦了了,因为接口定义了太多类,于是JDK设计者对于集合的顶层设计做了进一步的分离,给出了一些Abstract相关类。

这是为什么初学的时候感觉集合类设计复杂难懂的原因。

因为这是一个庞大重要的模块,类设计为了方便使用做了交叉冗余。

具体实现类有些来自接口,有些来自抽象类,就是因为这个原因。

通用的API主要是设计元素的增删改查,元素个数统计,集合清空,以及集合和数组的转换等。

有空再整理

返回JAVA基础目录–>

你可能感兴趣的:(JAVA基础)