集合容器面试题(2)

96 阅读2分钟

ArrayList的优缺点

优点

  • ArrayList底层以数组实现,是一种随机访问模式、实现了RandomAccess接口,查找非常快
  • ArrayList在顺序添加元素时非常方便 缺点
  • 删除/插入元素时做一次元素复制操作。因此如元素量大便会比较耗费性能 使用场景 ArrayList比较适合顺序添加、随机访问的场景。

数组与List之间的转换

  • 数组转List:使用Arrays.asList(array)进行转换
  • List转数组:使用List自带的toArray()方法

ArrayList和LinkedList的区别

  • 数据结构实现:
  1. ArrayList是动态数组的数据结构实现
  2. LinkedList是双向链表的数据结构实现
  • 随机访问效率:
  1. ArrayList比LinkedList的效率快,因为LinkedList是线性数据存储方式,所以需要移动指针从前向后依次查找
  • 增加和删除效率:
  1. 非首尾的增加和删除操作,LinkedList比ArrayList效率快,因为ArrayList增删操作要影响数组内其它数据的下标
  • 内存空间占用:
  1. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储两个引用,一个指向前元素,一个指向后元素
  • 线程安全:ArrayList和LinkedList都是不同步的,所以都不是线程安全的 综合来说
  • 在需要频繁读取集合中的元素时,更推荐使用ArrayList
  • 在插入和删除操作较多时,更推荐使用LinkedList 补充 数据结构基础之双向链表
  • 双向链表也叫双链表,是链表的一种,它的每个数据节点都有两个指针,分别指向直接后驱和直接前驱。所以,从双向链表中的任意节点开始,都可以很方便的访问它的前驱节点和后继节点。

ArrayList和Vector的区别是什么

这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合

  • 线程安全:Vector 使用了Synchronized 来实现线程同步,是线程安全的,而ArrayList是非线程安全的
  • 性能:ArrayList在性能方面优于Vector
  • 扩容:ArrayList和Vector都会根据实际的需要动态的调整容量,只不过在vector扩容每次会增加1倍,而ArrayList只会增加50%
  1. Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象,但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
  2. ArrayList不是同步的,所以在不需要保证线程安全时建议使用ArrayList