链表VS数组
2021-04-11 21:33
标签:复杂度 进一步 优势 删除 双向链表 hashmap 内存碎片 决定 就是 1、链表是通过“指针”将一组零散的内存块串联起来的数据结构 链表VS数组 标签:复杂度 进一步 优势 删除 双向链表 hashmap 内存碎片 决定 就是 原文地址:https://www.cnblogs.com/jetqiu/p/13358080.html
2、链表可以分为单链表、双向链表和单/双向循环链表
2.1、删除链表中等于某个值的节点,单链表和双向链表的时间复杂度一样
2.2、由于双向列表可以直接找到前驱结点,所以删除指定的节点,双向链表比单向链表高;同时在链表的某个指定结点前面添加一个结点,双向链表比单链表也有很大的优势
2.3、对于一个有序链表,双向链表可以与当前节点的前后节点比较,然后决定往前还是往后进一步折半查找,这种情况下查询的效率也要比单链表高一些
2.4、因为双向链表中的结点已经保存了前驱结点的指针,所以内存消耗会比单向链表多,但是这都是以空间换时间的设计思想
3、 LinkedHashMap就是用双向链表这种数据结构实现的
4、链表 VS 数组
4.1、数组的缺点是大小固定,一经声明就要占用整块连续内存空间。所以申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时会申请失败,报内存不足,即便内存的剩余总可用空间大于 100MB;但是如果我们申请的是 100MB 大小的链表就不会有问题
4.2、数组实现上使用连续的内存空间可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以办法有效预读
4.3、如果对内存的使用非常苛刻,那数组就比较合适。因为链表中的每个结点都需要消耗额外的存储空间去存储一份指向下一个结点的指针,所以内存消耗会翻倍。而且,对链表进行频繁的添加、删除操作,还会导致频繁的内存申请和释放,容易造成内存碎片,在Java中可能会导致频繁的 GC