吐槽:这个数据结构有点意思,其余的都是数组,就他是链表,值得一看,考核的基本功
1 数据结构
老规矩,先上图
兄弟们,我们明显看到有俩Node first last 我们先点进去瞅瞅吧
小伙伴们,这是个高级货啊,静态内部类(这种高级货 以后专门写一篇,不要在意就把他当做普通类暂时先),标准的双向链表形势,存储本身元素的同时还存储他的前后指针,老铁666啊
但是回过头来,问题来了,为毛还有个first last区分呢?
看他的注释,英文注释,哦哦,明白了,他娘的他把开头第一个节点的跟结尾最后一个节点单独拎出来了,为啥呢,咱们继续往下看 MMP 蚂蚁看了十几分钟才看懂
2 add方法
蚂蚁用注释把原因解释了,就不再赘述了,Last跟first的意思近似,就不赘述了
3 remove方法
remove方法有好几个remove removeFirst removeLast,稍微看看
删除方法,感觉没啥好讲的,不看源代码都能猜出来,肯定是遍历找到元素,删除前后元素的指针
Game Over,其实主要是其数据结构 其存储的数据结构决定了其插入删除 查询等等,所以数据结构是基本功啊小伙伴们,回去多啃啃数据结构吧
查询:get方法
LinkedList底层的数据结构是双向链表,他对于元素的查找方式是顺序查找,即是从第一个元素出发,经过n个节点找到最终的节点
源码如下
可以看到,他虽然做了一次判断,二分查找,但是遍历次数还是顺序查找,远远没有数组的随机查找来的快,查询效率非常的差
因此,使用get()方法的效率极其的低下,而for循环遍历用的都是for,这也是为什么LinkedList遍历不使用for循环的原因 而使用Iterator迭代器的原因
问题升级
遍历的方式有三种
1、传统的for循环遍历,基于计数器的:基于get方法进行获取元素
2、迭代器遍历,Iterator:基于hasnext next
3、foreach循环遍历:类似于Iterator
这三种方案该如何去选择呢?
大家可以思考下,一般数组类型的就直接用for,链表使用LinkedList,不过有一个注意事项,那就是你不能在遍历的时候去做删除或者插入操作,这样会发生异常
大家可以思考下,实在想不到点击如下链接
[https://blog.youkuaiyun.com/farxix/article/details/102920658]