问题:LinkedList 的 Node 怎么理解?
Node 是 LinkedList 的私有静态内部类,作为链表结构的基本元素,可以看作是链条上的一个节(结)点。一个 node 对象中除了存储元素的值外,还存储着前一个 node 和后一个 node 的引用。
问题:LinkedList 内部是怎么存放数据的?
LinkedList 对数据进行封装,在内部组装成 Node。LinkedList 由下面几个部分组成,主体为若干个 Node,首尾各一个 Node 的引用,一个记录 Node 个数的 size。前后的 Node 之间互相引用,构成双向链表。如果链表为空,first 和 last 都指向 null,如果链表中只有一个 Node,first 和 last 都指向这个 Node(first 和 last 都是这个 Node 的引用)。如果链表有多个 Node,first 和 last 分别指向链表首尾的 Node。对于每个 Node 来说,如果该 Node 前还有 Node,那么这个 Node 的 prev 指向前一个 Node,否则 prev 指向 null;如果该 Node 后还有 Node,那么这个 Node 的 next 指向后一个 Node,否则 next 指向 null。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZHqRveea-1670756874922)(https://wenshixin.gitee.io/blog/2018/12/16/LinkedList%E4%B8%AA%E4%BA%BA%E7%90%86%E8%A7%A3/LinkList%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9B%BE.png)]
问题:LinkedList 是怎么进行查找的?
LinkedList 相比于 ArrayList 的优势在于插入和删除,劣势是查找,LinkedList 类使用双向链表一定程度上确实可以提高查找效
率。
LinedList 中的查询分为两种,一种是根据 index 查询 node(包含元素值),也即是 node() 方法,另一种是根据 object(元素值) 查询 index,也即是 indexOf() 方法。链表不像数组那样,可以根据 index 直接查询出元素的值,因为两者在内存种的结构是不一样的,数组存储在连续的内存空间,而链表存储不需要连续的内存空间。
链表中的 index 只是标记元素的相对于链表头部(first 指向的)node 的个数,这样在根据 index 查询时,可以根据 index 和 size 的关系,提高查询性能。当 index 大致在链表的前半部分时(index < (size >> 1)),从链表的首部开始遍历显然更快,而当 index 大致在链表的后半部分时(index > (size >> 1)),从链表的尾部开始遍历显然更快,这样就使得查找次数从 n 次将为了 n/2 次,虽然查找算法的时间复杂度还是 O(n)。
根据元素值来查找 node 的 index,使用的是 indexOf() 方法和 lastIndexOf() 方法,前一个方法是从前往后查找,后一个方法是从后往前查找。
问题:LinkedList 内部一些方法的区别?
LinkedList 内部有很多功能相同的方法,方法内部大多都是调用 link 相关的方法。
| LinkedList | 添加元素 | 删除元素 | 查看元素 |
| — | — | — | — |
| 作为链表 | add()、set() | unlink()、remove() | get() |
| 作为队列 | offer() | poll() | peek() |
| 作为栈 | push() | pop() | 无 |
问题:LinkedList 和 ArrayList 的区别
LinkedList 是基于双向链表实现的,ArrayList 是基于数组实现的。
LinkedList 添加、插入、删除元素速度更快,而 ArrayList 查询速度更快。
于数组实现的。
LinkedList 添加、插入、删除元素速度更快,而 ArrayList 查询速度更快。