1.ArrayList的简介
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
- ArrayList是以泛型方式实现的,使用时必须要先实例化
- ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
- ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
- ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
- 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
- ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
2.ArrayList使用
2.1ArrayList的构造
我们发现在对ArrayList实例化时,有三种实例化方法,即ArrayList底部有三种构造方法
2.1.1 ArrayList() 无参构造
public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
2.1.2 ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
public ArrayList(Collection<? extends E> c) {Object[] a = c.toArray();if ((size = a.length) != 0) {if (c.getClass() == ArrayList.class) {elementData = a;} else {elementData = Arrays.copyOf(a, size, Object[].class);}} else {// replace with empty array.elementData = EMPTY_ELEMENTDATA;}}
2.1.3ArrayList(int initialCapacity)|指定顺序表初始容量
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {this.elementData = EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}}private static final Object[] EMPTY_ELEMENTDATA = {};
2.2ArrayList常见操作
方法 | 解释 |
---|---|
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List < E > subList(int fromIndex, int toIndex) | 截取部分 list |
2.2.1boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
public static void main(String[] args) {List<Integer> list=new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);List<Integer> list1=new ArrayList<>();list1.add(5);list.addAll(list1);System.out.println(list);}
2.2.2 boolean remove(Object o) 删除遇到的第一个 o
public static void main(String[] args) {List<Integer> list=new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(4);list.add(4);list.remove(4);//只能删除4这个元素,并不能指定删除第几个元素list.remove(new Integer(4));//使用该方法可以指定删除4这个元素,但该方法已过时System.out.println(list);}
2.2.3 List < E > subList(int fromIndex, int toIndex) 截取部分 list
public static void main(String[] args) {List<Integer> list=new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println(list);List<Integer> list1=list.subList(1,3);System.out.println(list1);list1.remove(1);System.out.println(list1);System.out.println(list);}
总结:sublist 截取字符串后不会产生新的对象,而是记录截取部分的地址,并获得权限对地址范围内的字符串修改。
2.3ArrayList的遍历
ArrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器
public static void main(String[] args) {ArrayList<Integer> list=new ArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);//1.使用下标+for循环遍历for (int i = 0; i < list.size() ; i++) {System.out.print(list.get(i)+" ");}System.out.println();//2.使用foreach循环遍历for (Integer integer:list) {System.out.print(integer+" ");}System.out.println();//3.使用迭代器遍历System.out.println("======迭代器遍历1========");Iterator<Integer> it =list.listIterator();{while(it.hasNext()){System.out.print(it.next());}}System.out.println();System.out.println("======迭代器遍历2========");ListIterator<Integer> lit=list.listIterator();while (lit.hasNext()){System.out.print(lit.next());}System.out.println();System.out.println("======迭代器遍历3========");ListIterator <Integer> listPrev= list.listIterator(list.size());//从index位置逆序打印while(listPrev.hasPrevious()){System.out.print(listPrev.previous());}
}
2.4ArrayList的扩容机制