Java 数组与ArrayList
数组
什么是数组?
JVM原生提供的定长数据结构,类型安全的
为什么没有看见定义?
JVM提供了虚拟机级别的支持,有对应的字节码.
相当于虚拟机层面定义了一个数组类,限制了类型,有插入和获取指定位置元素的方法.(可以这样子理解但是不存在这个类)
有专门指令来操作数组.
JVM中"["表示数组
ArrayList
基于什么实现?
数组
查找/插入/删除时间复杂度
- 查找:O(1) 可以实现随机查找,查找任何一个数都是常数时间
- 数组的寻址操作时间复杂度是O(1)的.因为内存中这是硬件电路实现的,可以无视数据量,直接定位到一个内存单元.
- 插入:O(n) 往头插一个元素,需要把原有这个位置的元素及之后的所有元素往后移动一位.
- 删除:O(n) 删除也类似,删除一个要将后面的元素往前移动
- 扩容是如何实现的?
- X1.5倍
- 拷贝 例子:电话本满了,买一本大1.5倍的然后把旧的和新增加的抄写进去.
- 执行add方法的时候判断
源码:
添加/删除/扩容/并发访问
add 添加元素,扩容操作(*1.5)
remove 删除元素,删除中间一个元素,要把后面往前补,如果删除最后一个,就只减一下下标.然后将最后一个空间设置成null(用于去除强引用,让无用的最后一个元素被GC)
checkForComodification() 检查并发访问的方法.用于操作集合过程中检查是否被并发访问的方法.防止出现并发操作集合.现在操作的数量和预期的不一致就表示出现并发访问.
add源码:
/**
* Appends the specified element to the end of this list.
* (将指定的元素附加到此列表的末尾)
*
* @param e element to be appended to this list(要附加到此列表的元素)
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
// 确保数组容量足够方法
ensureCapacityInternal(size + 1); // Increments modCount!! (modCount计数增加 用于并发修改判断)
// 将元素添加进数组最后一个位置
elementData[size++] = e;
return true;
}
private