但这里的前提是要提前预设 ArrayList 的数组长度,避免数组扩容,这样 ArrayList 的写入效率是非常高的,而 LinkedList 的虽然不需要复制内存,但却需要创建对象,变换指针等操作。
而查询就不用多说了,ArrayList 可以支持下标随机访问,效率非常高。
LinkedList 由于底层不是数组,不支持通过下标访问,而是需要根据查询 index 所在的位置来判断是从头还是从尾进行遍历。
但不管是哪种都得需要移动指针来一个个遍历,特别是 index 靠近中间位置时将会非常慢。
总结高性能应用都是从小细节一点点堆砌起来的,就如这里提到的 ArrayList 的坑一样,日常使用没啥大问题,一旦数据量起来所有的小问题都会成为大问题。
所以再总结下:
再使用 ArrayList 时如果能提前预测到数据量大小,比较大时一定要指定其长度。
尽可能避免使用 add(index,e) api,会导致复制数组,降低效率。
再额外提一点,我们常用的另一个 Map 容器 HashMap 也是推荐要初始化长度从而避免扩容。