标签:数加 rom cat array equals ret 定位 pac tst
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList继承自AbstractList,实现了List、RandomAccess、Cloneable、Serializable接口
1.无参构造
/**
* 第一种、调用ArrayList(10)默认初始化一个大小为10的Object数组
(DEFAULTCAPACITY_EMPTY_ELEMENTDATA=10)
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2.有参构造
/**
*第二种
*/
public ArrayList(int initialCapacity) {
//如果用户初始化大小小于0抛异常
//否则新建一个用户初始值大小的Object数组
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* 第三种、将容器数组化处理并将这个数组值赋给Object数组
*/
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
//当c.toArray返回的不是Object类型的数组时,进行下面转化
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// 用空数组替换
this.elementData = EMPTY_ELEMENTDATA;
}
}
//第一步:
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
//第二步:
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
//第三步:
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// 如果添加元素后大于当前数组的长度,则进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//第四步:(扩容)
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//将数组的长度增加原来数组的一半
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//如果扩充一半后仍然不够,则newCapacity=minCapacity;(minCapacity实际元素的个数)
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
//第一步:
public void add(int index, E element) {
rangeCheckForAdd(index);
//检查index的值是否在0到size之间,可以为size。
ensureCapacityInternal(size + 1); //看elementData的长度是否足够,不够扩容
//将elementData从index开始后面的元素往后移一位
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
//第二步:(多了判断index是否超出范围)
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
//第三步:
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
//第四步:(判断是否需要扩容)
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// 如果添加元素后大于当前数组的长度,则进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//第五步:(扩容)
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//将数组的长度增加原来数组的一半
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//如果扩充一半后仍然不够,则newCapacity=minCapacity;(minCapacity实际元素的个数)
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
public E remove(int index) {
//第一步:如果index>=size抛出异常
rangeCheck(index);
modCount++;
//第二步:获取删除元素的值
E oldValue = elementData(index);
//第三步:将index后面所有元素往前移一位
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;
//第四步:返回要删除的元素
return oldValue;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
//第一步:
public E set(int index, E element) {
//检查index是否小于size,如果不是抛异常
rangeCheck(index);
E oldValue = elementData(index);
//覆盖ArrayList中index上的元素
elementData[index] = element;
//返回被覆盖的元素
return oldValue;
}
//第二步:
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
//第一步:
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
//第二步:
static void subListRangeCheck(int fromIndex, int toIndex, int size) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > size)
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}
//1)修改次数加1
//2)强elementData中空余的空间(包括null值)去除,
//例如:数组长度为10,其中只有前三个元素有值,其他为空,那么调用该方法之后,数组长度变为3
public void trimToSize() {
//修改次数加1
modCount++;
if (size < elementData.length) {
elementData = (size == 0)?
EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);
}
}
public Object[] toArray() {return Arrays.copyOf(elementData, size);}
//第一种方式(最常用)
Integer[] integer=arrayList.toArray(new Integer[0]);
//第二种方式(容易理解)
Integer[] integer=new Integer[arrayList.size()];
arrayList.toArray(integer);
contains()
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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;
}
public class Test01 {
public static void main(String[] args) {
List<String> list1=new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
//第一种遍历方式:迭代器
Iterator<String> iterator=list1.iterator();
while (iterator.hasNext()){
String result=iterator.next();
System.out.println(result);
}
//第二种遍历方式:通过下标遍历
for (int i = 0; i < list1.size(); i++) {
String result=list1.get(0);
System.out.println(result);
}
//第三种遍历方式:for-each
for (String a:list1) {
System.out.println(a);
}
}
}
第二种遍历的效率是最高的。
三种方式时间差对比:
package com.woniu.chapter23;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @Author: Aweicy
* @Date: 2020/4/110:33
*/
public class Test01 {
public static void main(String[] args) {
List<String> list1=new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
list1.add("B");
list1.add("C");
Long time1=System.currentTimeMillis();
//第一种遍历方式:迭代器
Iterator<String> iterator=list1.iterator();
while (iterator.hasNext()){
String result=iterator.next();
System.out.println(result);
}
Long time2=System.currentTimeMillis();
System.out.println(time2-time1);
Long time3=System.currentTimeMillis();
//第二种遍历方式:通过下标遍历
for (int i = 0; i < list1.size(); i++) {
String result=list1.get(0);
System.out.println(result);
}
Long time4=System.currentTimeMillis();
System.out.println(time4-time3);
Long time5=System.currentTimeMillis();
//第三种遍历方式:for-each
for (String a:list1) {
System.out.println(a);
}
Long time6=System.currentTimeMillis();
System.out.println(time6-time5);
}
}
分析得出下面结论:
ArrayList总体来说比较简单,不过ArrayList还有以下一些特点:
标签:数加 rom cat array equals ret 定位 pac tst
原文地址:https://www.cnblogs.com/aweicy-1/p/12677597.html