代码改变世界

Java Collections Framework——把所有的皮鞋都拿出来擦一擦

2018-02-26 12:06  Essense&&Root  阅读(247)  评论(0)    收藏  举报

# Java合集框架的结构

Java合集框架的设计是使用接口,抽象类和具体类的一个很好的例子。

用接口定义框架。抽象类提供这个接口的部分实现。具体类用具体的数据结构实现这个接口。

Collection是处理对象合集的根接口。AbstractCollction类提供Collection接口的部分实现。除了add, size和iterator方法之外,它实现了Collection接口中的所有其他方法。

add, size和iterator等方法在合适的子类中实现。

 

!!!如果某个方法在子类中没有意义,可以throw new UnsupportedOperationException("Method not supported");

!!!除了java.util.PriorityQueue没有实现Cloneable接口外,Java合集框架中所有其他具体类都实现了java.lang.Cloneable和java.io.Serializable接口。

因此,除了优先队列,所有Cloneable的实例都是可克隆的,可序列化的。

 

# 迭代器

Iterator 是一种经典的设计模式,用于遍历一个数据结构。

Iterator接口为遍历各种类型的合集中的元素提供了一种统一的方法。

首先,Collection 接口继承自Iterable 接口,这意味着——所有Collection 都是可迭代的。这在意义上达成了可迭代。

Iterable 接口中定义了 iterator 方法,该方法会返回一个迭代器。

到这里,我们拿到了该集合的一个迭代器。

迭代器中包含三个方法,用于遍历元素。

hasNext() // 如其名, has next?

next() // 返回下一个元素

remove()

 

传统的遍历一个合集中的元素是比较麻烦的

for(int i = 0; i < arr.length; i++){
    // polish a shoe    
}

有了所谓迭代器,就可以foreach  Iterable 的所有实例。(foreach 循环可以用于数组)

for(String ele : collection){
    // polish shoe  
}

我到没感觉到它方便了多少。

 

顺便提一下,Lisp 和 Python 中提供的一种遍历模式——map。(对表的映射)

map 是一个高阶函数,map(proc, list)

proc 是一个过程,定义了对元素的某种操作/变换,map会将 proc 应用到 list 中的每个元素,然后将处理结果收集进一个 list 返回。

表——表 的变换,这是一种更高层次的抽象和思考。