vector线程安全但同步粒度粗,arraylist非线程安全但性能优;vector扩容默认翻倍或按增量增长,arraylist扩容增50%;现代开发优先选arraylist配合显式同步或并发集合。

同步机制:一个内置锁,一个靠外部保障
Vector所有核心方法(如add、remove、get、size)都用synchronized修饰,每次调用都会独占对象锁。这意味着多线程直接读写同一个Vector实例,不会出现数据错乱或ConcurrentModificationException。
ArrayList完全不加锁,所有方法都是非同步的。多线程并发修改时,可能引发状态不一致、数组越界或迭代器失效等问题。若需线程安全,必须由开发者主动处理,例如:
- 用Collections.synchronizedList(new ArrayList())包装
- 在关键代码块外加synchronized(list)
- 改用CopyOnWriteArrayList(适用于读多写少场景)
扩容策略:翻倍 vs 增半,内存与频次的权衡
Vector默认扩容是“翻倍”——新容量 = 旧容量 × 2。比如当前容量12,扩容后变成24。如果构造时指定了capacityIncrement(如new Vector(10, 5)),则按“旧容量 + 增量”增长,更可控。
ArrayList扩容公式是oldCapacity + (oldCapacity >> 1),即增加原容量的50%。例如容量10 → 扩容为15;容量16 → 变成24。这种渐进式增长减少单次扩容开销,也更节省内存,尤其在元素数量缓慢增长时优势明显。
两者共性是扩容时都要调用System.arraycopy()复制全部元素,所以频繁扩容仍会影响性能。建议预估大小,通过构造函数指定初始容量(如new ArrayList(200))来规避早期多次扩容。
实际选型:别因“线程安全”误用Vector
Vector虽自带同步,但粒度太粗——整个方法体被锁住,哪怕只是读取size()也要排队等待。高并发下容易成为瓶颈。
现代开发中,Vector已基本被替代:
- 单线程或可控并发 → 直接用ArrayList
- 需要强一致性写操作 → 考虑ConcurrentHashMap思路的线程安全集合(如CopyOnWriteArrayList、BlockingQueue)
- 仅需简单同步包装 → Collections.synchronizedList比Vector更轻量且语义清晰
Vector是JDK 1.0遗留类,而ArrayList自JDK 1.2起就是集合框架一员,API设计更统一、扩展性更好。










