首先,我们要知道Java 集合主要分为两个派系,一个是 Collection 系列,一个是 Map 系列。
我们今天的主角是ArrayList,它属于Collection。
使用idea的话,使用F4就可以看到源代码
public class ArrayListextends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID =8683452581122892189L;
/**
* Default initial capacity.初始化为的容量为10
*/
private static final int DEFAULT_CAPACITY =10;
/**
* 这个是动态数组
*/
transient Object[]elementData;// non-private to simplify nested class access
我们这里讲解这个常用的方法
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
Objects.checkIndex(index,size);
return elementData(index);
}
这说明的get方法会对范围的合法性进行检查
public E set(int index,E element) {
Objects.checkIndex(index,size);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
set方法也是如此,set方法和get方法一样,必须要对ArrayList里面已经有的元素才能操作,不然会报IndexOutOfBoundsException错误
当时小编就遇到了相关问题...
遇到一篇好博文
http://www.cnblogs.com/java-zhao/p/5102342.html
附上他所提示的重难点:
ArrayList基于数组方式实现,无容量的限制(会扩容)
添加元素时可能要扩容(所以最好预判一下),删除元素时不会减少容量(若希望减少容量,trimToSize()),删除元素时,将删除掉的位置元素置为null,下次gc就会回收这些元素所占的内存空间。
线程不安全
add(int index, E element):添加元素到数组中指定位置的时候,需要将该位置及其后边所有的元素都整块向后复制一位
get(int index):获取指定位置上的元素时,可以通过索引直接获取(O(1))
remove(Object o)需要遍历数组
remove(int index)不需要遍历数组,只需判断index是否符合条件即可,效率比remove(Object o)高
contains(E)需要遍历数组
网友评论