ArrayList
内部维护一个Object数组,初始容量为10。
新增元素时,根据当前容量判断是否扩容,每次扩容增加当前容量的一半。
删除元素时,把index+1及以后的元素,复制到index及以后元素的位置
获取元素时,直接根据下标返回
LinkedList
内部是一个双向链表,维护first和last,Node类型,每个Node都有prev和next。
新增元素时,直接给last添加next。
删除元素时,先获取要删除的Node,再改变prev和next。
获取元素时,根据index是否小于size的一半来使用正查和倒查,最坏情况时间复杂度为O(n/2)
ArrayList和LinkedList都是线程不安全的。
ArrayList查找更快,但是新增时要扩容,删除时要复制数据,不如LinkedList
CopyOnWriteArrayList
翻译:写时复制,只改变了写相关的方法,get方法不变
内部和ArrayList一样,也维护一个Object数组,区别是,在涉及修改数据的方法中加了synchronized修饰符,且操作前先复制出一个同样的新数组,对新数组修改后,再改变旧数组的引用。
相比ArrayList是线程安全的,但是性能差,占内存高,更容易触发GC,而且没有实时性,get的时候很可能还是旧数据,因为同步代码块还没执行完。
Vector
内部也维护一个Object数组,读写方法也跟ArrayList实现一样,不过都加了synchronized修饰符,且扩容后是之前的2倍。
总结:
单线程访问时,用ArrayList
多线程访问,读多写少,且读不要求实时性,用CopyOnWriteArrayList
其他情况,用Vector