携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3,点击查看活动详情
ArrayList
ArrayList 类是一个动态修改的数组,没有固定大小限制,可以对其添加或删除元素。ArrayList 继承 AbstractList ,并实现了 List 接口。
Vector类
Vector类是在 java 中可以实现自动增长的对象数组,实现了一个动态数组。Vector 是同步访问的Vector 包含了许多传统的方法,这些方法不属于集合框架。Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。
Arraylist 和 Vector 的区别?
- ArrayList实现了List接口,底层使用Object[ ]存储,一般用于频繁查找,线程不安全。
- Vector是List古老实现类,也是使用Object[ ]存储,但是线程是安全的。
Arraylist 与 LinkedList 区别
ArrayList 和 LinkedList 都不保证线程安全; Arraylist 存储使用的是 Object 数组;LinkedList 存储使用的是双向链表进行存储; ArrayList 支持高效的随机元素访问,而LinkedList 不支持; ArrayList 在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的每一个元素都需要消耗比 ArrayList 需要更多的空间(前驱以及数据等);
ArrayList 扩容机制分析
每次存储一个元素时,arraylist会对list的容量进行判断。用ensureCapacityInternal() 方法 每次在add()一个元素时,arraylist都需要对这个list的容量进行一个判断。通过ensureCapacityInternal() 方法确保当前ArrayList维护的数组具有存储新元素的能力,经过处理之后将元素存储在数组elementData的尾部。
ArrayList构造方法:
- 无参的构造方法:public ArrayList();
- 根据传入的数值大小,创建指定长度的数组:ublic ArrayList(int m);
- 通过传入Collection元素列表进行生成:public ArrayList(Collection<? extends E> c)。
ArrayList扩容机制
一
- 无参构造,ArrayList容量为0时,如果要添加元素,那么首先需要扩容,第一次容量为10,后面扩容则正常扩容;
- 传容量构造,如果参数为0 ,那么创建ArrayList后容量为0,添加第一个元素后容量为1,后面正常扩容;
- 传列表构造,列表为空时,ArrayList容量为0,添加第一个元素后,容量为1,后面正常扩容。
二
如果ArrayList的容量大于0,当ArrayList是满的时,直接正常扩容,每次扩充的容量是原理的1.5倍。
System.arraycopy() 和 Arrays.copyOf()方法
- 两者 copyOf()内部都了 System.arraycopy() 方法;
- arraycopy() 需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置 copyOf() 是系统自动在内部新建一个数组,并返回该数组。
ensureCapacity方法
使用ensureCapacity 方法可以提升ArrayList性能。不过,这个性能差距几乎可以忽略不计。