长城不是一天修建的,JDK也是。
集合最初也是使用了顶层设计的思路,java最初版本知识为最常用的数据结构提供了很少的一组类:
Vector、Stack、Hashtable、BitSet与Enumeration接口。
其中Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制。
以人们熟悉的数据结构–队列–queue为例,看下是如何分离的。
队列接口之处可以在队列尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数。
当需要收集对象,并按照先进先出的规则检索对象时就应该使用队列。
队列很常见,业务场景发送代码,短信,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类库中,集合类的基本接口是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基础目录–>