数据结构归纳整理版1.0
写在前面的话:
每次面试基本逃脱不了java基础 数据结构 而我本人基础又不牢固 生背下来了人家一深问就露馅了 所以花时间多看了一下数据结构知识

数据结构的基本分类

线性结构
-
数组
元素在内存中线性连续存储,可以根据下标快速访问数组元素,查找的效率高(O(1)),但是增删效率不是很高,每一次增加或删除元素都需要
大量移动元素空出插入位置或者填补删除元素的位置(复杂度是O(n))。 适用场景:频繁查询 很少进行增删改的场景;
数组的访问通过索引完成,即:“数组名称[索引]”,但是需要注意的是,数组的索引从0开始,所以索引的范围就是0 ~ 数组长度-1,例如开辟了3个空间的数组,所以可以使用的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产生java.lang.ArrayIndexOutOfBoundsException 异常信息;
数组本身是一个有序而且有限的数据集合 所以采用for循环的方式进行遍历操作,
-
链表:
存储可以不连贯,根据索引将数据联系起来,当查询元素的时候需要从开头开始去查询复杂度O(n),所以效率比较低,然而增加或删除元素的时候只需要修改索引(复杂度O(1))就可以了。适用场景:少查询,需要频繁插入或删除的情况;
链表的实现原理
- 创建一个节点类,其中节点类包含两个部分,第一个是数据域(你到时候要往节点里面储存的信息),第二个是引用域(相当于指针,单向链表有一个指针,指向下一个节点;双向链表有两个指针,分别指向下一个和上一个节点)
- 创建一个链表类,其中链表类包含三个属性:头结点、尾节点和大小,方法包含添加、删除、插入等等方法。
引申一下hashmap![]()
通过哈希函数计算出实际存储地址,然后从数组中对应地址取出即可。当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。
HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;
如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好
HashMap put方法逻辑图(JDK1.8)

- 队列:
特点:先进先出(FIFO/fisrt in first out),如同一个单向隧道,先进的车先出 使用场景:多线程的阻塞队列管理非常有用
- 栈:
特点:后进先出(LIFO/last in first out),就像一个箱子,先放进去的东西在底部,需要先拿出上面的东西,下面的东西才能拿出来
参考博客来源:https://blog.csdn.net/woshimaxiao1/article/details/83661464


浙公网安备 33010602011771号