微信搜索:小大白日志

Arraylist面试三连问

点赞在看,养成习惯,微信搜索「小大白日志」关注这个搬砖人。

本文在公众号文章已同步,还有各种一线大厂面试原题、我的学习系列笔记。

Arraylist为什么要加transient?

ArrayList源码中的数组为:transient Object[] elementData;
因为Arraylist有初始化大小,往往Arraylist的长度是大于实际元素个数,序列化这些空闲位置的内容会很浪费,但加上transient关键字后,在序列化的时候elementData不被序列化,所以同时Arraylist重写了序列化所需的writeObject()、readObject()方法,只序列化elementData数组中有值的位置的元素

Arraylist中add和get的时间复杂度?

add(i)、get(i)时间复杂度都是O(1),add(index,value)时间复杂度为O(n)

  • Arraylist中add源码:两种方法添加元素
//把元素添加到数组尾部
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // 检查是否需要扩容,size为当前实际元素个数,size+1为添加元素后所需的最小数组容量;第一次添加元素时size为0,传入1
    elementData[size++] = e;//检查完再往里面添加元素
    return true;
}
//把元素添加到数组特定的下标处
public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);   // 检查是否需要扩容
    System.arraycopy(elementData, index, elementData, index + 1,size - index);//检查完先拷贝元素:把元素后移
    elementData[index] = element;//再添加元素
    size++;
}
  • Arraylist中get()源码
public E get(int index){
    rangeCheck(index);
    return elementData(index);
}
public E elementData(index){
    return (E)elementData[index];
}

ArrayList和LinkedList的区别?

  • 底层数据结构不同

ArrayList的底层结构是数组:

transient Object[] elementData;

LinkedList是双链表:

transient Node<E> first;
transient Node<E> end;
  • ArrayList的添加删除操作需要移动元素,效率慢;LinkedList只改变指针位置即可,效率块
  • ArrayList直接通过下标可以随机访问元素,效率块快;LinkedList需要遍历链表才能访问元素,效率慢
  • ArrayList一般占用的空间比实际存储元素的空间大,而LinkedList则在添加新元素时实时获取新的空间
  • 应用场景:ArrayList适合应用于多查询少插入,LinkedList适合应用与多插入少查询;但若在数组尾部插入元素,ArrayList只需移动少量元素即可,而LinkedList还需要找到链表尾部才可插入,此时ArrayList比LinkedList效率高

OK,如果文章哪里有错误或不足,欢迎各位留言。
创作不易,各位的「三连」是二少创作的最大动力!我们下期见!

posted @ 2021-06-06 21:10  明天喝可乐  阅读(75)  评论(0)    收藏  举报