看一下 JDK 中的集合类,比如 List一族或者Set一族,都是实现了 Iterable 接口,但并不直接实现 Iterator 接口 。仔细想一下这么做是有道理的:因为 Iterator接口的核心方法 next() 或者 hasNext() 是依赖于迭代器的当前迭代位置的 。若 Collection 直接实现 Iterator 接口,势必导致集合对象中包含当前迭代位置的数据(指针) 。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么 next() 方法的结果会变成不可预知 。除非再为 Iterator接口 添加一个 reset() 方法,用来重置当前迭代位置 。但即使这样,Collection 也只能同时存在一个当前迭代位置(不能同时多次迭代同一个序列:必须要等到当前次迭代完成并reset后,才能再一次从头迭代) 。而选择实现 Iterable 接口则不然,每次调用都会返回一个从头开始计数的迭代器(Iterator),因此,多个迭代器间是互不干扰的 。
16、适配器模式
适配器模式将一个类的接口转换成客户期望的另一个接口,让原本不兼容的接口可以合作无间 。也就是说,适配器模式用于实现新、老接口之间的转换与适配,其魅力在于:不改变原有接口,却还能使用新接口的功能 。
文章插图
适配器模式主要包含以下四个角色,其内涵分别为:
(1)Target: 客户所期待的接口;
(2)Adaptee: Adapter 所包装的对象,即被适配的类(适配者);
(3)Adapter: 一个用于包装不兼容接口的对象的包装类,通过包装一个需要适配的对象,把原接口转换成目标接口;
(4)Client:客户端;
适配器模式的三个特点:
适配器对象实现原有接口;
适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象);
对适配器原有接口方法的调用被委托给新接口的实例的特定方法 。
文章插图
1、模板方法模式
模板方法模式是一种基于继承的代码复用技术,是一种类行为型模式,其核心在于:定义一个操作中算法的框架,而将一些步骤延迟到子类中 。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 。
文章插图
18、策略模式策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,核心思想是:面向接口编程 。
策略模式的经典应用包括Spring的PlatfromTransactionManager,JDK 排序策略 (不同的Comparator)等,其优点包括:
(1)算法可以自由切换,避免使用多重条件判断;
(2)扩展性良好 。
策略模式与模板方法的区别:
对于策略模式而言,一个“策略”是一个整体的(完整的)算法,算法是可以被整体替换的;而模板方法只能被替换其中的特定点,算法流程是固定不可变的 。在思想和意图上看,模板方法更加强调:
①定义一条线(算法流程),线上的多个点是可以变化的(具体实现在子类中完成),线上的多个点一定是会被执行的,并且一定是按照特定流程被执行的 。
②算法流程是唯一的入口,对于点的访问是受限的 。
19、Java 自动装箱、拆箱机制Java为每种基本数据类型都提供了对应的包装器类型 。所谓自动装箱机制就是自动将基本数据类型转换为包装器类型,而自动拆箱机制就是自动将包装器类型转换为基本数据类型 。在JDK中,装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的(xxx代表对应的基本数据类型) 。但是,
(1)Integer、Short、Byte、Character、Long 这几个类的valueOf方法的实现是类似的,共享[-128,127];
(2)Double、Float的valueOf方法的实现是类似的,无限不可列举,不共享;
(3)Boolean的valueOf方法的实现不同于以上的整型和浮点型,只有两个值,有限可列举,共享;
什么时候装箱/拆箱?
至于什么时候装箱,什么时候拆箱主要取决于:在当前场景下,你需要的是引用类型还是原生类型 。(例如,使用equals方法时传进来原生类型的值);若需要的是原生类型,但传进来的值是引用类型,则自动拆箱(例如,使用运算符进行运算时,操作数是包装类型) 。
推荐阅读
- 网络编程之 Https 详细分析,超详细知识点
- 如果C++最强大,为什么它不及Java、Python流行?
- Nginx和Tomcat配合实现Java Web服务热部署
- Google 官方Java 编码规范
- JavaScript 里的奇葩知识
- 对于 JavaScript 中循环之间的技术差异概述
- 推荐5个爆款Java开源博客,是我目前用过最好用的博客系统
- 为什么Java类不支持多继承而接口可以?
- 如何利用Java代码操作索引库?
- Java8——异步编程