LinkedList:
底层由链表实现,因此查询慢,插入删除快。LinkedList比ArrayList更加占用内存,因为LinkedList每个节点要存储前后两个节点的引用,影响较小,一般不做选择参考。
ArrayList:
底层由数组实现,因此查询快,插入删除较慢。扩容机制:正常情况下会扩容1.5倍(有最小扩容数 DEFAULT_CAPACITY = 10,当1.5倍后小于10时,扩容为10 ),特殊情况下(新扩展数组大小已经达到了最大值)则只取最大值。使用小技巧:当需要一次性加入大量数据时,可以提前指定容量,这样可以减少扩容次数,增加代码效率。可以在实例化时通过构造方法指定容量大小,如果是往已存在的集合添加大量数据,可以通过 list.ensureCapacity(size) 方法从新指定容量大小。
Vector:
底层由数组实现,通过在修改数据的方法上加synchronized关键字的方式实现了线程安全,不过由于过于老旧,效率不高,在可以使用 CopyOnWriteArrayList的情况下,优先考虑 CopyOnWriteArrayList。
Collections.synchronizedXXX():
Java集合框架提供了工厂方法创建线程安全的集合,这些方法的格式如下:Collections.synchronizedXXX(collection)其将返回一个Collections的内部类,例如SynchronizedList,其内部主要靠在操作数据的方法套上synchronized关键字实现线程安全效果。在我们使用iterator来遍历线程安全的集合对象的时候,我们还是需要添加synchronized字段来确保线程安全,因为Iterator本身并不是线程安全的通过该方法转换出来的集合性能较差,不推荐使用。
CopyOnWriteArrayList:
读写分离,读不加锁,写加锁,这样就提高了其多线程下的性能表现。CopyOnWriteArrayList 合适读多写少的场景,因为写的代价太过昂贵其内部通过一个不可变的内部数组,以及在添加数据时使用ReentrantLock,保证了线程安全,但由于其设计,也使得添加操作的消耗极其惊人,必须谨慎使用,使用在几乎不会添加操作,而是大量读操作的情况。CopyOnWriteArrayList 的缺点:由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致内存溢出。弱一致性,由于写的时候会产生新的数组,且读操作无锁,所以会出现读的数据已经被修改的情况,不适合要求及时性的数据存储,例如库存。