为什么Java集合框架(Java Collection Framework) 叫框架?

好久没更新了, 今天继续开启闲扯时间,扒拉几个问题聊聊吧.

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());

之所以这么简单几行代码就能完美融入集合类体系,因为集合框架设计的非常好.

我们只需要简单实现getsize,至于这两个函数在迭代器中何时被调用, 在ArrayList的参数里怎样被调用,都已经被限定好了.调用关系是这里面的红线.

  • 当我们作为标准类的使用者时候, Collection是一个库
  • 当我们作为自定义集合类的开发者的时候, Collection是一个框架

2. 为什么Java集合框架要添加Queue接口?

先看一张图,这个是最早的初代Collection 实现

为什么Java集合框架(Java Collection Framework) 叫框架?

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接口获得了这样的能力.

为什么Java集合框架(Java Collection Framework) 叫框架?

对了, 这两句英文不是我说的啊. 

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

为什么Java集合框架(Java Collection Framework) 叫框架?

后话

这篇有点水. 主要目的是分享这个PPT,前面的废话都是引子.

还有就是在想要不要开个微信群,来直接分享这些东西,而不是在文章里贴链接.哪位看官要是有兴趣, 可以加我微信. 超过5个人感兴趣,我就开个群.为什么Java集合框架(Java Collection Framework) 叫框架?个人微信在此,备注”群”二字即可.


参考资料

[1]

链接: 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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!