ArrayList
基于动态数组实现。在内存中是连续的内存空间,适合下标访问(随机访问)(数组中存储的是同一类型的数据,长度固定,方便实现下标访问)。
扩容
因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组。
插入
如果不是尾部插入数据还会 涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能。
LinkedList
基于链表实现。在内存中是不连续的内存空间,维护着大量的
Node
节点,插入删除时只需要改变及节点的指向即可,效率高。查询时,都回遍历整个集合,包括indexOf()
等方法,就算结果为空也会遍历整个列表。
总结
优先使用
ArrayList
,初始化时制定合适的大小(减少数组扩容的性能消耗),使用尾插法进行元素插入(减少元素移动)。LinkedList
主要是维护着大量的节点消耗性能,只能使用Interator
进行遍历。