Vector
Vector
区别:ArrayList 没有进行同步,扩容1.5倍,Vector进行同步,扩容2倍
同步:区别于ArrayList,使用synchronized进行同步,开销大,访问速度慢
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
扩容:
1、传入 capacityIncrement 参数,在扩容时使容量 capacity 增长 capacityIncrement;
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
2、capacityIncrement <=0时,每次都令 capacity 为原来的两倍
即调用Vector构造函数Vector(int initialCapacity)时,默认每次扩容容量翻倍
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
3、一般情况下使用ArrayList,同步操作自定义实现比较好
多线程下可以使用
(1)线程安全的ArrayList: Collections.synchronizedList()
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<>(list) :
new SynchronizedList<>(list));
}
(2)concurrent 并发包的 CopyOnWriteArrayList
List<Object> arrayList = new CopyOnWriteArrayList<>();
读写分离:复制的数组上写(写操作加锁),原数组上读
//写操作 如添加方法 add()
public boolean add(E e) {
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();//解锁
}
}
//读操作 如 获取方法 get()
private E get(Object[] a, int index) {
return (E) a[index];
}
使用场景:读多写少,实时性要求低的场景。
CopyOnWriteArrayList 在写操作的同时允许读操作,大大提高了读操作的性能。
缺点:内存占用,写操作会复制一个新数组,相当于对了一倍内存占用;
数据不一致,读操作不能实时获取数据,可能部分写操作未同步到数组中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?