java的List集合

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 的缺点:
由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致内存溢出。
弱一致性,由于写的时候会产生新的数组,且读操作无锁,所以会出现读的数据已经被修改的情况,不适合要求及时性的数据存储,例如库存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值