介绍
这篇文章主要讲解了“java中数组与链表的比较”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中数组与链表的比较”吧!
<编辑类="目录">目录编辑>- <李>
数组与链表的比较:
李> <李>ArrayList:
李> <李>LinkedList:
李> <李>总结
李>数组与链表的比较:
- <李>
数组通过下标访问的话是O (1)
李> <李>数组一旦声明长度就是固定的
李> <李>数组的数据是物理逻辑均连续的
李> <李>链表增删要快一些,数组遍历快一些
李> <李>长度一定的话,数组的存储空间比链表要小
李>ArrayList:
ArrayList是列表接口的实现类,它是支持根据需要而动态增长的数组;java中标准数组是定长的,在数组被创建之后,它们不能被加长或缩短。这就意味着在创建数组时需要知道数组的所需长度,但有时我们需要动态程序中获取数组长度.ArrayList就是为此而生的。
扩容机制发生在添加()方法调用的时候,
,, public boolean 添加(E e), { ,,,,,,//扩容 ,,,,,,,ensureCapacityInternal(时间+ size 1);,,//, Increments modCount ! ! ,,,,,,,elementData大小(+ +),=,e; ,,,,,,,return 真实; ,,,}
该行代码ensureCapacityInternal()是用来扩用的,形参是最小扩容量,进入该方法后:
private void ensureCapacityInternal (int minCapacity), { ,,,,,,,ensureExplicitCapacity (calculateCapacity (elementData, minCapacity)); ,,,}
通过方法calculateCapacity (elementData minCapacity)获取:
,,, private static int calculateCapacity (Object [], elementData,, int minCapacity), { ,,,,,,,//如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值 ,,,,,,,if (elementData ==, DEFAULTCAPACITY_EMPTY_ELEMENTDATA), { ,,,,,,,,,,,return Math.max (minCapacity DEFAULT_CAPACITY也); ,,,,,,,} ,,,,,,,return minCapacity; ,,,}
使用ensureExplicitCapacity方法可以判断是否需要扩容:
, private void ensureExplicitCapacity (int minCapacity), { ,,,,,,,,,modCount + +; ,,,,,,,,,//,如果最小需要空间比elementData的内存空间要大,则需要扩容 ,,,,,,,,,if (minCapacity 安康;elementData.length 祝辞,0) ,,,,,,,,,,,,,//扩容 ,,,,,,,,,,,,,增长(minCapacity); ,,,,,}
需要扩容,进入ArrayList扩容的关键方法生长():扩大为原来的1.5倍;
, private void 生长(int minCapacity), { ,,,,,,,,,//,获取到ArrayList中elementData数组的内存空间长度 ,,,,,,,,,int oldCapacity =, elementData.length; ,,,,,,,,//,扩容至原来的1.5倍 ,,,,,,,,int newCapacity =, oldCapacity +, (oldCapacity 在祝辞,1); ,,,,,,,,//,再判断一下新数组的容量够不够,够了就直接使用这个长度创建新数组, ,,,,,,,,,//,不够就将数组长度设置为需要的长度 ,,,,,,,,if (newCapacity 作用;minCapacity & lt;, 0) ,,,,,,,,,,,,newCapacity =, minCapacity; ,,,,,,,,//若预设值大于默认的最大值检查是否溢出 ,,,,,,,,if (newCapacity 安康;MAX_ARRAY_SIZE 祝辞,0) ,,,,,,,,,,,,newCapacity =, hugeCapacity (minCapacity); ,,,,,,,,//,调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间 ,,,,,,,,//,并将elementData的数据复制到新的内存空间 ,,,,,,,,elementData =, Arrays.copyOf (newCapacity elementData也); ,,,,}
至此得出ArrayList扩容的本质是计算出新的扩容数组的大小后实例化,并将原有数组内容复制到新数组中去。
LinkedList:
链表实现扩容,直接在尾指针后面加入新的元素即可。
实现LinkedList: LinkedList的底层实现是链表。更深理解是一个双向链表。
<强>节点代码:强>
//节点 public class  Node { Node 先前;//前继,指向前一个节点 Object 数据;//节点数据 Node 未来;//后继,指向后一个节点 public 节点(),{ } public 节点(Node 此前,Object 数据,Node 下),{ 超级(); this.previous =,之前; null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nulljava中数组与链表的比较