声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.
目录快捷跳转
ArrayList实现的接口
- RandomAccess: 实现这个接口就具备了随机访问的能力,给一个索引下标,可以立即O(1)取得该位置的元素;
- Cloneable: 可复制的能力;
- List: 线性表接口;
- Serializable: 序列化接口,ArrayList这个类就可以方便的转为字节数组进行输入输出;
List下关于动态数组的实现有两个子类ArrayList和Vector
- ArrayList和Vector都是基于动态数组的实现;
- ArrayList是异步操作,线程不安全,效率高;
- Vector是同步操作(对整个数组进行加锁操作,线程安全,效率比较低);
- 现在Vector已经很少使用了,要使用线程安全的动态数组,使用juc包下CopyOnWriteArrayList(更加细化的读写锁机制来保证线程安全);
关于ArrayList的构造方法
方法 | 解释 |
---|---|
ArrayList() | 无参构造 |
ArrayList(Collection<? extends E> c) | 利用其他 Collection 构建 ArrayList,复制别的List集合的元素作为自己的初始化元素 |
ArrayList(int initialCapacity) | 指定顺序表初始容量,根据用户传入的长度指定内部的数组初始化长度 |
List接口中的常用方法
在接口中定义的这些方法,无论哪个具体子类都需要实现; 更换具体子类,使用的方法完全不变;
此时ArrayList中remove方法名称都一样,重载; 当List集合保存的就是整型,调用remove方法默认会调用按照索引删除; 若想按值删除,先调用indexOf方法获取该数值在List集合中对应的索引,然后调用remove删除对应的索引即可;
什么是遍历
- 就是按照一定的规则将集合中的所有元素全部访问一遍,做到不重复,不遗漏,这种操作集合的方式称为集合的遍历;
- 打印输出只是遍历的一种体现,遍历并不只是打印输出;
关于ArrayList的三种不同的遍历方式
- 普通for循环 + get方法进行遍历
- for-each循环(Iterable接口的子类都可使用for-each循环);
- 使用集合的迭代器(专门为了遍历一个集合产生的),对于List集合的子类,有一个接口Iterator接口,从前向后遍历:
hasNext() => 判断集合是否还有元素没有遍历
next() => 取出当前要遍历的元素
调用ArrayList的listIterator()方法就可以取得当前集合的迭代器;
这三种遍历方式,用哪一个
- 只是普通遍历,不牵扯到集合内容的修改时,用哪个都可以;
- 但是,若在遍历的过程中,修改(add set remove)了集合的内容,要使用迭代器方式;
- 在遍历一个集合的同时修改了这个集合,假设我们这个集合是由多个用户同时访问的,其中一个用户修改了该集合的内容,其他用户就可能看到不一样的结果;
- 尽量不要在集合遍历的时候修改元素,若一定要修改,使用迭代器来修改;