ArrayList

ArrayList

1.Clonable接口

  • 浅拷贝只复制的对象的引用,无法做到完全复制
  • 深拷贝如何实现:不简单复制引用,复制引用类型对象的新引用

Arrays.asList(T…t) 返回的List不支持add操作

Arrays.asList(T…t) 返回的List不支持add操作,因为它里面的ArrayList是Arrays的内部类 ,父类的add方法直接抛出了异常 UnsupportedOperationException。

subList 方法

  1. ArrayList的subList方法返回的是SubList类的对象(ArrayList的内部类),转成ArrayList时会抛类型转换异常。

  2. 对subList(ArrayList中的方法)返回的结果List操作,实际修改的是原来的ArrayList.

  3. ConcurrentModificationException:

    如果你使用 subList 方法获取了一个子列表,这之后又在原始列表上进行了新增或删除的操作,这是,你之前获取到的 subList 就已经废掉了,不能用了,不能用的意思就是你在 subList 上进行遍历、增加、删除操作都会抛出异常,没错,连遍历都不行了。

ArrayList和LinkedList

相同

  • 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

不同

  • 2. 数据结构: Arraylist 使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!)
  • 3. 插入和删除是否受元素位置的影响:ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n)。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
  • 4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
  • 5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)

构造方法:

1.通过空参构造方法创建集合对象并未构造一个初始容量为十的空列表,仅仅将 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的地址赋值给elementData

2.通过传入容量0作为参数,仅仅将EMPTY_ELEMENTDATA 的地址赋值给elementData

ArrayList遍历方法

因为它实现了RandomAccess接口,支持随机访问,用for循环比用迭代器块。

LinkedList采用迭代器遍历(是顺序访问)更快。

ArrayList 插入方法源码

先检查插入后是否溢出 : size+1 - elementData.length > 0,满足条件进行扩容为原来1.5倍,拷贝(Arrays.copyof() - > System.arraycopy(,,,,))原数组到新数字。

然后赋值,size++.

面试题

1.ArrayList是如何扩容的?

new ArrayList() 创建的空数组(默认空容量),当add时,会调成默认容量10.

后面按1:1.5扩充。

2.ArrayList插入或删除元素一定比LinkedList慢么?

  1. 数组删除元素确实要比链表慢,慢在需要创建新数组,还有比较麻烦的数据拷贝,但是在ArrayList 底层不是每次删除元素都需要扩容,因此在这个方面相对于链表来说数组的性能更好

  2. LinkedList删除元素之所以效率并不高,其原理在于底层先需要对整个集合进行折半的动作,然后 又需要对集合进行遍历一次,这些操作导致效率变低

4.5 如何复制某个ArrayList到另一个ArrayList中去?

使用clone()方法 使用ArrayList构造方法 使用addAll方法


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!