ArrayList详解
ArrayList是实现了List接口,其内部是基于数组实现的:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // non-private to simplify nested class access
}
数组的大小是固定的,一旦创建的时候指定了大小,就不允许再被修改了,只有在数组满的时候会自动扩容,因此是非常长灵活的。
创建一个ArrayList
创建一个ArrayList示例如下:
List<Object> list1=new ArrayList<>();
ArrayList<Object> list2=new ArrayList<>();
由于ArrayList实现了List接口,所以list1也可以是List类型。
向ArrayList添加元素
ArrayList添加元素的代码如下所示:
list.add(new Object);
需要注意的是:ArrayList一般插入元素是插在尾部,而且在插入的时候会判断当前维护的数组空间是否足够,如果不够则会执行grow()方法进行扩容。
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
更新ArrayList中的元素
在ArrayList中更新元素的操作如下:
Object oldData = list1.set(index, newData); //index指的是要更新元素的下标, newData指的是要更新值,oldData是返回的旧值
set源码如下所示:
public E set(int index, E element) {
Objects.checkIndex(index, size); //检查是否越界!!!
E oldValue = elementData(index);
elementData[index] = element;
return oldValue; //返回旧值
}
删除ArrayList中的元素
删除ArrayList中元素的示例如下:
list1.remove(index); //根据索引删除
list1.remove("data"); //根据值删除
remove源码如下:
public E remove(int index) {
Objects.checkIndex(index, size); //检查是否越界
final Object[] es = elementData;
@SuppressWarnings("unchecked") E oldValue = (E) es[index];
fastRemove(es, index);
return oldValue;
}
public boolean remove(Object o) {
final Object[] es = elementData;
final int size = this.size;
int i = 0;
found: {
if (o == null) {
for (; i < size; i++)
if (es[i] == null)
break found;
} else {
for (; i < size; i++)
if (o.equals(es[i]))
break found;
}
return false;
}
fastRemove(es, i);
return true;
}
查找ArrayList中的元素
查找元素可以分为正序查找和倒序查找,用法如下:
list1.indexOf("data"); //正序查找,如果找到第一个,则返回下标
list1.lastIndexOf("data"); //倒序查找,如果找到第一个,则返回下标
源码如下:
public int indexOf(Object o) {
return indexOfRange(o, 0, size);
}
int indexOfRange(Object o, int start, int end) {
Object[] es = elementData;
if (o == null) {
for (int i = start; i < end; i++) {
if (es[i] == null) {
return i;
}
}
} else {
for (int i = start; i < end; i++) {
if (o.equals(es[i])) {
return i;
}
}
}
return -1;
}
/**
* Returns the index of the last occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the highest index {@code i} such that
* {@code Objects.equals(o, get(i))},
* or -1 if there is no such index.
*/
public int lastIndexOf(Object o) {
return lastIndexOfRange(o, 0, size);
}
int lastIndexOfRange(Object o, int start, int end) {
Object[] es = elementData;
if (o == null) {
for (int i = end - 1; i >= start; i--) {
if (es[i] == null) {
return i;
}
}
} else {
for (int i = end - 1; i >= start; i--) {
if (o.equals(es[i])) {
return i;
}
}
}
return -1;
}
标签:index,return,int,ArrayList,Object,详解,es
From: https://www.cnblogs.com/xiaomitu/p/17132771.html