006java集合浅析1

     2022-03-14     277

关键词:

在本系列教程的上一篇文章中,使用画图的方式展示了JDK中集合框架的基础体系结构。对于其中的Collection组来说,其顶级的接口是Iterable接口,估计熟悉设计模式的读者已经明白,此处该接口的引入就是为了实现迭代器模式。

        关于什么是设计模式或者具体到什么是迭代器模式,本文不会展开,不了解的朋友,建议另找资料补充。关于设计模式的学习,我觉得必须给大家推荐一本书,名为《HeadFirst 设计模式》,该书以幽默风趣的方式,非常详细和深入地讲解了23种设计模式中的常见设计模式,同时,该书中的实例代码使用的Java语言,让人倍感亲切。

        如果由于各种原因导致暂时没有时间或者精力去学习和掌握迭代器模式,对于学习和吸收本文的知识也不会有太大的影响,大家可以先掌握使用方法和逻辑,背后的原理可以日后再补习。首先,我们来看一下JDK中Iterable接口的源码:

public interface Iterable<T> {

    Iterator<T> iterator();

}

可以看到整个接口的内容非常简单,只有一个方法,该方法返回一个Iterator(迭代器)。看到这里我们就知道,所有实现了Iterable接口的类中都有一个可以返回迭代器的iterator()方法。

        我们继续深入跟踪下去,发现Iterator也是一个接口,无论是否知道迭代器设计模式,背后的原理都是面向对象编程的三大特性(封装、继承、多态)。Iterator是一个非常简单的接口,源码如下:

public interface Iterator<E> {

    boolean hasNext();

    E next();

    void remove();

}

源码面前无秘密,可以看到Iterator接口也只有三个方法:hasNext()方法用于判断是否还有下一个元素;next()方法用于获取下一个元素;remove()方法用于移除当前迭代位置处的某个元素。

        此处,我必须感叹一下面向对象编程范式之强大和接口功能之灵活。首先,把遍历集合并且访问或者移除集合元素的一套操作使用迭代器Iterator接口包装起来。其次,以Iterable接口统一标识可以产生Iterator接口的集合类型。最后,只需集合类型去实现Iterable接口,并依据自身的特点生成具体的Iterator接口实现类。整个的思想和实现方式就是标准的迭代器模式,非常精妙。

        在看完了Iterable接口的设计之后,我们再接着往下走。Iterable接口的直接子类是Collection接口,具体源码如下:

public interface Collection<E> extends Iterable<E> {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator<E> iterator();

    Object[] toArray();

    <T> T[] toArray(T[] a);

    boolean add(E e);

    boolean remove(Object o);

    boolean containsAll(Collection<?> c);

    boolean addAll(Collection<? extends E> c);

    boolean removeAll(Collection<?> c);

    boolean retainAll(Collection<?> c);

    void clear();

    boolean equals(Object o);

    int hashCode();

}

从Collection接口含有的方法来看,该接口很好地模拟了一个集合的概念。该接口包含的方法不少,都是一些很直观的增加、移除、判断等方法。注意:由于Collection并没有继承Object从而获得equals(Object o)方法和hashCode(),而实际上Collection接口对应的集合概念又应该有这两个方法,所以这里自己引入这两个方法。

        我们知道Collection接口的下面具有多种子类型,比如:

1)List

2)Set

3)Queue

虽然他们在表征的数据结构类型和数据的实际存储方式上具有很大的差异性,但他们都具有Collection接口的所有方法,必要时,可以通过向上转型来使用。

?最后,我们来总结一下:Collection组的接口数量和分支数量都比较多,Map组的接口数量较少,且是一条直线分支;Collection组的顶级接口是Iterable,Map组的顶级接口是Map。实际上,整个集合框架的完整体系结构远比这个复杂,但只要我们心中有这两个图,那么无论是吸收集合框架的后期教程还是实际工作中对数据结构的选择,都能做到手到擒来。

  本系列文档会在本人的微信公众号发布,欢迎大家扫码关注。

                技术分享

java集合框架浅析

集合框架示图Collection接口和Map接口方法API介绍Collection接口:booleanadd(Ee):添加元素到集合中booleanaddAll(Collection<?extendsE>c):将指定collection中的所有元素都添加到此collection中(可选操作)。voidclear():移除此collection中的所有... 查看详情

浅析java集合

Colection单例集合是众多java集合的根接口,全部集合都是实现了该接口一、List集合       实现该接口的特点:有序性,可重复性      1.ArrayList                 底层使用object数组实现,查询速度快(... 查看详情

浅析java集合

Colection单例集合是众多java集合的根接口,全部集合都是实现了该接口一、List集合       实现该接口的特点:有序性,可重复性      1.ArrayList                 底层使用object数组实现,查询速度快(... 查看详情

java学习入门-05-集合浅析

集合数据结构体系框架Collection接口是List/Set/Queue接口的父接口,其中定义的常用的操作方法有(注意此处笔记不完整,演示代码没有导包):添加功能?i.booleanadd(objectobj)添加一个元素?ii.booleanaddAll(Collectionc)将集合c的全部元素添... 查看详情

007java集合浅析2

在本系列的上一篇教程中,我们已经分析过了Collection组的两个顶级接口Iterable和Collection,接下来我们来分析一下Collection接口的子类型。        首先,我们看一下List接口,该接口映射的是数据结构中... 查看详情

万字长文浅析java集合中的排序算法

...容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通用、高效、实用这几点特征。使用什么样排序算法会比较合适,能够做到在尽量降低时间、空间复杂度的情况下,又要兼顾保证稳定... 查看详情

java8集合框架——集合工具类collections内部方法浅析(代码片段)

...装类)四、Dynamicallytypesafecollectionwrappers(动态类型安全集合包装类)五、Emptycollections(空集合)六、Singletoncollections(单例集合)七、Miscellaneous(杂项/其他)零:Collections的官方注释  英文注解比较简短,直接贴了出来。大... 查看详情

java面向对象-006-接口

p.p1{margin:0.0px0.0px0.0px0.0px;font:14.0px"YuantiSC";color:#000000}p.p2{margin:0.0px0.0px0.0px0.0px;font:14.0px"YuantiSC";color:#000000;min-height:20.0px}一、Java接口//接口在JAVA中是一个抽象类型,是抽象方法的集合,通常以interf 查看详情

浅析java中的泛型(代码片段)

...llo!大家好!今天的主题就是:泛型。在使用集合类时,大家就已经接触到泛型了,那就是每个集合类后面的尖括号<>,这样一对尖括号,在java中就称为泛型。那么泛型这一个点,我们又该知... 查看详情

集合框架浅析

一CollectionFramworkDiagram二重要接口类解析 1Collection(元素无序)  数组具有良好的随机访问性能,但数组中元素类型单一,一旦声明其空间大小固定。Collection弥补了数组空间不可扩充的缺陷,既可以加入任意类型的对... 查看详情

学习笔记-集合hashmap源码浅析

/** *HashMap主要方法解析,jdk1.7版本的HashMap *一、构造 *4个构造相对之前的jdk版本功能基本不变,但是代码封装更完善。 *构造前一个参数是容量,相当于数组大小,后一个是负载因子 */publicHashMap(intinitialCapacity,... 查看详情

浅析java--继承

1、为什么要使用继承 减少代码的冗余,实现代码的复用。下面举例说明:java老师类:publicclass DotNetTeacher{privateStringname;//老师姓名privateStringschool;//所在学院public DotNetTeacher(StringmyName,StringmySchool){name=myName;schoo 查看详情

夺命雷公狗—java---006---大小写问题

夺命雷公狗—JAVA---006---大小写问题1,源码文件名.java大小写的问题源码文件名不区分大小写,但是极力推荐区分大小写 2,字节码文件名(类名)严格区分大小写 3,代码中大小写严格区分大小写 温馨提示,玩JAVA基... 查看详情

博客网站系统-006view层

1.showAllArticle.jsp1<%@pagelanguage="java"contentType="text/html;charset=gb2312"2pageEncoding="gb2312"%>3<%@tagliburi="/struts-tags"prefix="s"%>4<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0 查看详情

深入浅析java注解

注解,相信大家都会知道,像@requestMapping,@Resource,@Controller等等的一些注解,大家都用过,那么,他的工具类你用过吗?下面就和大家一起来分享一下注解工具类。 注解的作用:         &nbs... 查看详情

浅析java位运算符计算方式

位运算符主要针对二进制,它包括了:“与”、“或”、“异或”。 1.与运算符(&表示)运算规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如:inta=5;intb=2;System.out.println("a和b与的结果是:"+(a&b));运... 查看详情

浅析java网络编程

1.网络方面   网络编程实际就是通过编程实现网络的通信,,实现计算机之间的通信。2.编程方面   有三种网络编程结构:(1)C/S编程结构:客户端和服务器端都需要专门的编程导致客户端比较难维护(2)... 查看详情

浅析关于java的一些基础问题(上篇)

    要想让一个问题变难,最基本有两种方式,即极度细化和高度抽象。对于任何语言的研究,良好的基础至关重要,本篇文章,将从极度细化的角度来解析一些java中的基础问题,这些问题也是大部分编程人员的... 查看详情