好久没更新了, 今天继续开启闲扯时间
,扒拉几个问题聊聊吧.
1.为什么Java集合框架(Java Collection Framework) 叫框架?
这个问题,其实我们以前聊过.
框架其实和Inversion of Control(IOC)概念有点关系. 这里可以给出一个粗略的判断方式: 如果引入了一个 jar (JAR) 包, 你需要按照他定义的方式去写代码,他来调用你, 那这个就是框架.反之,则不是. 这里是有点好莱坞法则的意思了对吧. 像 spring, netty 这种,都可以叫做框架,因为他们给使用者带来了约束. 而gson,guava这种, 就不是框架.
他其实既是框架又是库,主要看使用者的角色.
平时使用ArrayList,HashMap之类的时候, 集合可以算做库. 但是当用户自己想要在Collection这个体系下,实现某种自己的扩展集合类型时候, 就能感觉到,为什么, 集合是一个框架了.
比如这里想实现一个自己的列表(FishList). 上午的时候为空, 下午使用这个列表时候, 里面有一个元素, 当天日期的字符串.
只需要这么简单的几行代码就可以做到.
public class FishList extends AbstractList {
@Override
public String get(int index) {
return LocalDate.now().format(DateTimeFormatter.ISO_DATE);
}
@Override
public int size() {
var hour = LocalTime.now().getHour();
return hour>12?1:0;
}
}
麻雀虽小, 但是这个列表借助了模板方法(Template Method)
设计模式, 实现了一个列表的基本功能.
//可以进行迭代器遍历(iterator)设计模式
for (Object j : new FishList()) {
System.out.println("j = " + j);
}
//可以交给Collections wrapper 进行包装,装饰器设计模式(decorator) 不过这个列表本身就是只读的
Collections.unmodifiableList(new FishList());
//也可以传递给别的集合类当参数
new ArrayList<>(new FishList());
之所以这么简单几行代码就能完美融入集合类体系,因为集合框架设计的非常好.
我们只需要简单实现get
和size
,至于这两个函数在迭代器中何时被调用, 在ArrayList的参数里怎样被调用,都已经被限定好了.调用关系是这里面的红线.
-
当我们作为标准类的使用者时候, Collection是一个库 -
当我们作为自定义集合类的开发者的时候, Collection是一个框架
2. 为什么Java集合框架要添加Queue接口?
先看一张图,这个是最早的初代Collection 实现

Java集合框架里的接口并不多, 整体看来, 其实就是3大类:
-
Map 解决映射问题 -
Collection 解决集合问题 -
List -
Set
今天怎么会又多出来一个队列(Queue)
. 为什么要添加一个Queue
接口呢?我们知道,这肯定不只是为了先入先出(FIFO). 比如优先队列(PriorityQueue)
在,这位就不是(FIFO)的.
Queue接口探秘
这事还得去接口本身看.
Queue一共给Collection
添加了3个功能,6个接口. 每个功能两个方法, 前一个会抛异常, 后一个不会.
add(E e),offer(E e)
element(),peek()
remove(),poll()
相较于List,Set
的方法, 这里的方法,大多有一个明显的特点: 没有参数
. 这,其实就是添加Queue
接口到集合框架里的原因. 提供一个无须参数即可获取元素的能力.
试想,如果,你有一个箱苹果, 是苹果的集合. 日常会有一个很下意识的动作, “集合,我要一个苹果”,而不是”集合,我要第三个苹果”.
在List,Set
之类的接口设计上, 就没这种自然表达方式.在收到一些反馈之后, 作者通过添加Queue接口获得了这样的能力.

对了, 这两句英文不是我说的啊.
今天这文章其实是一个PPT的读后感,上面的图也是出自那里.PPT作者叫 Joshua . 链接[1]放在文末了,也可以通过点击查看原文,获得PPT. 当然,下图也出自那里.

后话
这篇有点水. 主要目的是分享这个PPT,前面的废话都是引子.
还有就是在想要不要开个微信群,来直接分享这些东西,而不是在文章里贴链接.哪位看官要是有兴趣, 可以加我微信. 超过5个人感兴趣,我就开个群.个人微信在此,备注”加群”二字即可.
参考资料
链接: https://www.cs.cmu.edu/~charlie/courses/15-214/2016-fall/slides/15-collections%20design.pdf
原文始发于微信公众号(K字的研究):为什么Java集合框架(Java Collection Framework) 叫框架?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/24808.html