AyyayList,LinkList详解
在编程中list这个并不陌生,是一个很常用的集合,那么它底层是什么呢?根据源码自己简单总结如下:
ArrayList : 它底层是-也是一个Object数组,与数组区别就是它可以自动扩充容量,这也是我们喜欢用的原因之一,我们不必担它的容量大小问题,当它存储数据超过数组设定阈值时会自动填充默认个大小空间。如下:就是arraylist底层数据结构,
打开其源码我们可知ArrayList线程不安全,它对于数据操作并没有使用同步操作,比如add
从其源码我们知道它新增元素的原理:首先先增加元素对象时确认其容量,在原有的大小加一,然后在增加在原有基础上增加1并将其元素加入。
其他方法原理我们可以查看源码进行获知,在这里不在一一列举。这样的存储机制也使得我们ArrayList具有插入,删除效率相对低的原因,在插入或删除元素时,整个集合元素要进行相对应的移动,使得效率相对底下,但是同时也带来了一些好处,比如我们查询相对比较快,因为在操作元素时记录其脚标。
那么我们在看一下linklist,其实底层是node
我们还是先看add
由源码可知,linklist增加过程,首先获取最后的node元素,如果为空则将node赋值在第一个位置,以后再add元素首先根据上一次末尾元素和传入元素创建一个新节点,然后判断将新增节点赋给下一节点,传入数据为当前结点,这就是linklist增加元素原理,它首先根据最后一节点元素和当前元素创建以新节点,将传入数据添中间结点,然后集合大小增加1.所以也就导致这种集合查询起来效率比较低,要循环查询上一节点与下一节点才能获取所要数据,但是它插入和删除元素比较快,不像arraylist那样整体进行移动。