更新时间:2020-07-15 16:43:29 来源:极悦 浏览2436次
ArrayList是基于Object数组实现的,我们可以通过下标来实现对元素的取,即可以实现随机访问,但是在插入的时候,需要移动大量元素,所以对于能够随机访问,而不经常进行增删的需求,我们尽量使用ArrayList。而LinkedList是基于链表实现的,那么在进行增删的时候,只需要修改相应的指针,就可以实现元素的增删,效率非常高,所以对于需要快速增删元素,应该选择LinkedList。
我们不仅要好奇,为什么LinkedList的插入效率这么高呢?下面我们通过源码来一探究竟。
从中,我们可以看出:通过add(int index,E element)向LinkedList插入元素时。先是在双向链表中找到要插入节点的位置index;找到之后,再插入一个新节点。
双向链表查找index位置的节点时,有一个加速动作:若index<双向链表长度的1/2,则从前向后查找;否则,从后向前查找。所以LinkedList的插入效率非常高,与之形成对比的,就是ArrayList的插入了。
从上面的方法可以看出,在进行插入之前,首先会调用ensureCapacity()方法,来保证ArrayList的容量,如果容量不足,首先要进行扩容,然后真正费时的就是这句:
System.arraycopy(elementData,index,elementData,index+1,size-index)
这句话表明,在插入的时候,会移动index后面的所有元素,这就是ArrayList插入元素效率低的原因。
下面我们来分析一下ArrayList和LinkedList随机访问的效率。
首先来看LinkedList的随机访问:
对于LinkedList来说,随机访问第index的元素,从头结点开始遍历,查找到index的位置,然后返回元素,这里只不过有一个加速遍历的动作而已。
但是对于ArrayList来说就不同了:
从中,我们可以看出:通过get(int index)获取ArrayList第index个元素时。直接返回数组中index位置的元素,而不需要像LinkedList一样进行查找。
以上就是极悦java培训机构的小编针对“Java中list的使用之List的应用场景”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习