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 在写操作的同时允许读操作,大大提高了读操作的性能。

缺点:内存占用,写操作会复制一个新数组,相当于对了一倍内存占用;

           数据不一致,读操作不能实时获取数据,可能部分写操作未同步到数组中

 

 

posted @   与长安故里  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示