Arraylist的底层数据是数组。
查询数据时可以通过下标定位,所以查询任意数据时所花费的时间是相同的。
但是当删除数据时,将数据删除后需要将后面的元素前移动。添加数据时元素不仅要后移还会涉及到数组的动态扩容操作,效率相对低下。
链表是由许多个结点组合而成的容器。
如图所示,我把数据a储存在了地址为10的结点中,由于此时并未与其他结点相连形成链表,所以在下个结点地址的位置填上^,表示为空。
再存入一个数据b在地址为20的结点中
此时我们需要将这个两个结点相连,以便把两个数据储存在同一链表里,需要将数据a的下个结点地址改为数据b的结点地址。
如果要增加或删除某个数据,只需在增加或删除结点后更改结点地址就行。
增加一个储存在结点地址为30的数据c在结点a与b之间:
只需将 a的下一结点地址改为c的结点地址,c的下一结点地址改为b的结点地址。
可以理解为只要两两结点保持首尾地址一致就行。
由此可见,链表的数据增删只需更改结点地址,比起数组要方便得多,但是正因为这种链式结构,导致了链表没有了下标索引,查询数据时,只能从第一个结点开始依次往下查询,十分耗时。
所以在实际应用中我们要分析客户的需求,偏向于存储大量数据的项目,就应该使用底层结构为链表的Linkedlist集合来创建对象。偏向于存储快速查询数据的项目,就应该用底层结构为数组的的Arraylist集合来创建对象。