欢迎光临
我们一直在努力

java集合类详解和使用,常用的java集合类

Java中常用集合

(图中vps云服务器忽略中间接口)

Collection接口族下的对象都是存的单一值的元素,而Map接口族下存的是key-value结构的数据。其中Set集合需借助Map集合来实现。

线程安全的List

ArrayList和LinkedList都不是线程安全的,在多线程环境下存在线程安全问题。

1.Vector

Vector通过在方法上加上synchronized关键字修饰来实现线程安全,但Vector的线程安全仅限于单个操作,多个操作并不能保证线程安全。

2.Collections.synchronizedList()

通过List list = Collections.synchronizedList(new ArrayList());
拿到线程安全的List,其内部是通过装饰者模式使用synchronized代码块加锁。

3. CopyOnWriteArrayList

CopyOnWriteArrayList位于java.util.concurrent并发包下,实现List接口。Vector和Collections.synchronizedList()都对get方法加了锁,而CopyOnWriteArrayList没有对读加锁。因为写操作每次都要新建一个数组,把原数组拷贝过去,在末尾加上新增元素,最后替换原数组,以此来保证读写并发时不需要对读操作加锁也能保证线程安全,但每次都要新建数组,对写性能有影响。

public boolean add(E e) {// CopyOnWriteArrayList采用ReentrantLock加锁 final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; // 每次都新建一个数组 Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } } 37037609

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。