如何理解并掌握 Java 数据结构

向作者提问
曾经先后在驴妈妈,携程,要买车公司担任过Java高级工程师、架构师、开发主管、技术经理等职务。在电商公司工作期间,负责过PC站和后端服务的平台架构、实现和升级。 目前在做一些Java架构工作。前后从业10几年没有离开Java,2015年出版《Java并发编程从入门到精通》。2018年出版《Spring Data Jpa从入门到精通》。 网名:张振华.Jack
查看本场Chat

Jack和大家一起来重温《Java数据结构》经典之作。

第一部分:Java数据结构

要理解Java数据结构,必须能清楚何为数据结构?

数据结构:

  1. Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系。
  2. 而各数据元素之间的相互关系,又包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。
  3. 而一个数据结构的设计过程分成抽象层、数据结构层和实现层。

数据结构在Java的语言体系中按逻辑结构可以分为两大类:线性数据结构和非线性数据结构。

一、Java数据结构之:线性数据结构

线性数据结构:常见的有一维数组,线性表,栈,队列,双队列,串。

1:一维数组

在Java里面常用的util有:String [],int [],ArrayList,Vector,CopyOnWriteArrayList等。及可以同过一维数组[]自己实现不同逻辑结构的Util类。而ArrayList封装了一些[]的基本操作方法。ArrayList和Vector的区别是:Vector是线程安全的,方法同步。CopyOnWriteArrayList也是线程安全的但效率要比Vector高很多。(PS:如果不懂出门右拐看另一篇chat)。

数组这种数据结构典型的操作方法,是根据下标进行操作的,所以insert的的时候可以根据下标插入到具体的某个位置,但是这个时候它后面的元素都得往后面移动一位。所以插入效率比较低,更新,删除效率也比较低,而查询效率非常高,查询效率时间复杂度是1。

2: 线性表

线性表是有序的储存结构、链式的储存结构。链表的物理储存空间是不连续的,链表的每一个节点都知道上一个节点、或者下一个节点是谁,通常用Node表示。常见的有顺序链表(LinkedList、Linked***),单项链表(里面只有Node类),双向链表(两个Node类),循环链表(多个Node类)等。

操作方法:插入效率比较高,插入的时候只需要改变节点的前后节点的连接即可。而查询效率就比较低了,如果实现的不好,需要整个链路找下去才能找到应该找的元素。所以常见的方法有:add(index,element),addFirst(element),addLast(element)。getFirst(),getLast(),get(element)等。

常见的Uitil有:LinkedList,LinkedMap等,而这两个JDK底层也做了N多优化,可以有效避免查询效率低的问题。当自己实现的时候需要注意。其实树形结构可以说是非线性的链式储存结构。

3: 栈Stack

栈,最主要的是要实现先进后出,后进先出的逻辑结构。来实现一些场景对逻辑顺序的要求。所以常用的方法有push(element)压栈,pop()出栈。

java.util.Stack。就实现了这用逻辑。而Java的Jvm里面也用的到了此种数据结构,就是线程栈,来保证当前线程的执行顺序。

4:队列

队列,队列是一种特殊的线性数据结构,队列只能允许在队头,队尾进行添加和查询等相关操作。队列又有单项有序队列,双向队列,阻塞队列等。

Queue这种数据结构注定了基本操作方法有:add(E e)加入队列,remove(),poll()等方法。

Sea
老师,连KMP算法都不讲,很多知识点一句话带过,请问写这篇文章的意义在何处?
张振华: 好意见,篇幅有限,只讲一下精华部分,留了一点悬念在gitchat群里现场交流,给大家留了一点思考空间。也希望大家多思考,说明这位同学还是认真了,值得肯定。
张振华
如果大家觉得老师付出的值的大家肯定,帮老师点赞和打5分好评哦。这样老师更有动力。
梅小西
我发现这个老师写的文章,基本上都是『点到为止』,『一笔带过』,请问都能随便百度到的东西,为何要花钱来看?
任武杰: 想让你花钱买人家的课撒
Mr.Potter
很赞!感谢!
yonguo
概括性的介绍,写的很清楚,感谢分享。请问有更详细的讲解Java数据结构和算法的资料或者书籍推荐吗?
jack
写的很有深度,讲解详细,五星好评,赞!
张曦
提纲挈领的作用吧,具体的知识没有讲到,给出了要掌握的知识地图,辛苦老师
李烨
预告的内容多一半没写啊
微信扫描登录