蚂蚁花呗:阿里巴巴面试:Java 集合知识点(附图文解析)( 三 )

  • 同步性:Vector 中的 public 方法多数添加了 synchronized 关键字、以确保方法同步、也即是 Vector 线程安全、ArrayList 线程不安全
  • 性能:Vector 存在 synchronized 的锁等待情况、需要等待释放锁这个过程、所以性能相对较差
  • 扩容大小:ArrayList在底层数组不够用时在原来的基础上扩展 0.5 倍 , Vector 默认是扩展 1 倍 扩容机制 , 扩容方法其实就是新创建一个数组 , 然后将旧数组的元素都复制到新数组里面 。 其底层的扩容方法都在grow() 中(基于JDK8)
    • ArrayList 的 grow() , 在满足扩容条件时、ArrayList以1.5 倍的方式在扩容(oldCapacity >> 1  , 右移运算 , 相当于除以 2 , 结果为二分之一的 oldCapacity)
    • Vector 的 grow() , Vector 比 ArrayList多一个属性 capacityIncrement , 可以指定扩容大小 。 当扩容容量增量大于 0 时、新数组长度为 原数组长度**+**扩容容量增量、否则新数组长度为原数组长度的 2 倍
    ArrayList 与 LinkedList 区别
    • 是否保证线程安全:ArrayList 和 LinkedList 都是不同步的 , 也就是不保证线程安全;
    • 底层数据结构:Arraylist 底层使用的是 Object 数组;LinkedList 底层使用的是双向循环链表数据结构;
    • 插入和删除是否受元素位置的影响:
      • ArrayList 采用数组存储 , 所以插入和删除元素的时间复杂度受元素位置的影响 。 比如:执行 add(E e)方法的时候 ,ArrayList 会默认在将指定的元素追加到此列表的末尾 , 这种情况时间复杂度就是O(1) 。 但是如果要在指定位置 i 插入和删除元素的话( add(intindexE element))时间复杂度就为 O(n-i) 。 因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作 。
      • LinkedList 采用链表存储 , 所以插入 , 删除元素时间复杂度不受元素位置的影响 , 都是近似, 而数组为近似。
      • ArrayList 一般应用于查询较多但插入以及删除较少情况 , 如果插入以及从删除较多则建议使用 LinkedList
    • 是否支持快速随机访问:LinkedList 不支持高效的随机元素访问 , 而 ArrayList 实现了 RandomAccess 接口 , 所以有随机访问功能 。 快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(intindex)方法) 。
    • 内存空间占用:ArrayList 的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间 , 而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据) 。
    高级工程师的我 , 可不得看看源码 , 具体分析下: