ArrayLIst(JDK1.8)
程序员文章站
2022-06-04 19:23:46
...
一.ArrayList 实现的接口
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList 是一个动态数组,能够自动扩容,在添加的时候首先判断是不是需要扩容
private void ensureExplicitCapacity(int minCapacity) {//minCapacity=size+1
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);//这就是扩容方法
}
二.类属性
private static final int DEFAULT_CAPACITY = 10 默认容量
private static final Object[] EMPTY_ELEMENTDATA = {};空对象
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};默认空对象
Object[] elementData;对象数组,数据存储
int size;数组存放数据长度
三.方法
1.add()
public boolean add(E e) {//添加数据到数组末尾
ensureCapacityInternal(size + 1); // Increments modCount!!
//判断是不是需要扩容,如果是就自动扩容
elementData[size++] = e;
return true;
}
2.add(O,index)
public void add(int index, E element) {//添加到指定位置
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);//直接用arraycopy复制
elementData[index] = element;
size++;
}
3.set(int index, E element)
返回值为修改前的数据
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
4. remove(int index)
返回移除的数据
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
//size-1
return oldValue;
}
5.clear() for循环置空,效率很慢
6.contains/indexOf
全都是用for遍历数组,很慢,尽量少用
public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; }
推荐阅读
-
JDK源码深入学习之ArrayList
-
Java编程中ArrayList源码分析
-
HashMap源码分析--jdk1.8
-
java语法ArrayList、LinkedList、HashSet、HashMap、HashTable、Collection、Collections详解
-
Java ArrayList扩容问题实例详解
-
Java中ArrayList的removeAll方法详解
-
ArrayList和LinkedList区别及使用场景代码解析
-
ArrayList扩容机制(基于底层代码讲解)
-
Action中ArrayList显示到JSP页面的具体实例
-
linkedlist和arraylist的区别是什么(java的四种引用关系从强到弱)