面试题:ArrayList和Vector有何异同点?

1. 相同点

  • 底层实现
    • ArrayListVector都是基于动态数组实现的,可以动态调整容量。
  • 允许元素
    • 两者都允许存储null值和重复元素。
  • 索引访问
    • 两者都支持通过索引快速访问元素(时间复杂度为O(1))。
  • 顺序性
    • 两者都保持元素的插入顺序。

2. 不同点

特性ArrayListVector
线程安全性非线程安全线程安全(方法使用synchronized修饰)
性能性能较高(无同步开销)性能较低(同步操作带来额外开销)
扩容机制默认扩容为原来的1.5倍默认扩容为原来的2倍
迭代器使用IteratorListIterator使用IteratorListIterator
历史JDK 1.2引入JDK 1.0引入(属于遗留类)
推荐使用场景单线程环境下使用多线程环境下使用

3. 详细说明

1. 线程安全性

  • ArrayList
    • ArrayList是非线程安全的。如果多个线程同时访问一个ArrayList实例,并且至少有一个线程修改了结构(如添加或删除元素),则必须手动同步。
  • Vector
    • Vector是线程安全的,其方法使用synchronized修饰,可以在多线程环境下直接使用。

2. 性能

  • ArrayList
    • 由于ArrayList没有同步开销,因此在单线程环境下性能优于Vector
  • Vector
    • Vector的同步操作会带来额外的性能开销,因此在单线程环境下性能较低。

3. 扩容机制

  • ArrayList
    • 当元素数量超过当前容量时,ArrayList会扩容为原来的1.5倍。
  • Vector
    • Vector默认扩容为原来的2倍,但可以通过构造函数指定扩容增量。

4. 历史

  • ArrayList
    • ArrayList是JDK 1.2引入的,属于Java集合框架的一部分。
  • Vector
    • Vector是JDK 1.0引入的,属于遗留类。虽然它仍然可以使用,但在现代Java开发中,通常推荐使用ArrayListCollections.synchronizedList()

5. 推荐使用场景

  • ArrayList
    • 在单线程环境下,优先使用ArrayList,因为它的性能更高。
  • Vector
    • 在多线程环境下,如果需要线程安全的集合,可以使用Vector,但更推荐使用Collections.synchronizedList()CopyOnWriteArrayList

4. 示例代码

ArrayList示例:

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        // 遍历
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

Vector示例:

import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("Apple");
        vector.add("Banana");
        vector.add("Orange");

        // 遍历
        for (String fruit : vector) {
            System.out.println(fruit);
        }
    }
}

5. 总结

特性ArrayListVector
线程安全性非线程安全线程安全
性能
扩容机制1.5倍2倍
推荐场景单线程多线程
  • 在单线程环境下,优先使用ArrayList,因为它的性能更高。
  • 在多线程环境下,如果需要线程安全的集合,可以使用Vector,但更推荐使用Collections.synchronizedList()CopyOnWriteArrayList
THE END
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容