List是一个接口,不能直接用来新建对象。我们需要使用List的子类才能创建实例对象
- ArrayList:底层使用的数组结构,特点:查询快、增删慢
- LinkedList:底层使用的是双向链表结构,特点是查询慢,增删快
- Vector:实现原理和ArrayList一样,区别是Vector是线程安全的,效率低;ArrayList线程不安全,效率高
数组和ArrayList使用的最多,开发中大部分是从数据库里查询数据并返回给浏览器的情况
LinkedList 更加适合 增删多,但是查询较少的场景
这三个实现类,能够调用的方法是一样的,都可以调用
add(E e) / add(int index, E e) / remove(Object obj) / remove(int index) / clear()
get(int index) / set(int index,E e) / indexOf(Object e) / lastIndexOf(Object obj)
public class ListSource {
public static void main(String[] args) {
Vector<String> arrayList = new Vector<>();
arrayList.add("hello");
arrayList.add("good");
arrayList.add(1, "yes");
System.out.println(arrayList.get(0));
arrayList.remove(1);
arrayList.set(0, "ok");
arrayList.clear();
}
}
1. ArrayList
1. 1 ArrayList源码分析
ArrayList 底层就是维护了一个Object类型的数组成员变量 elementData,增删慢,但是查询快
常量:
- int DEFAULT_CAPACITY=10; 如果不指定数组的长度,当调用add方法添加元素时,数组的默认长度为10;
- Object[] EMPTY_ELEMENTDATA = {}; 如果不指定数组的长度,默认是一个空数组
成员变量:
- Object[] elementData:ArrayList的核心,ArrayList里所有的数据都保存在这个数组里
- int size:用来记录数组里元素的个数
构造方法:
- ArrayList():空参构造方法,Object[] elementData 默认值是{}
- ArrayList(int initialCapacity):有参构造,数组指定长度initialCapacity
方法:
- add(E e):如果数组的长度为0,先初始化数组,长度设置为 DEFAULT_CAPACITY=10;
如果存满了,容量扩充为原来的1.5倍,新建一个数组,并把原来的数据复制过去,elementData再指向新的数组,添加元素时,将元素放入到elementData数组的下标为size的位置上,然后再让size自增
- add(int index,E e):
- remove(int index):
public class ArrayListSource {
public static void main(String[] args) {
List<String> list2 = new ArrayList<>(10);
List<String> list = new ArrayList<>();
list.add("good");
list.add("yes");
list.add("ok");
list.add("no");
list.add("hi");
list.add("hello");
list.add("go");
list.add("come");
list.add("you");
list.add(1, "she");
list.add("here");
list.remove(0);
}
}
1.2 LinkedList
LinkedList源码分析: 底层维护了一个双向链表结构,增删快,但是查询慢
LinkedList里存储的数据是 一个一个的 Node类型的对象
成员变量:
int size = 0; 表示元素的个数
Node<E> first; 表示first元素
Node<E> last; 表示最后一个元素
构造方法:
LinkedList():空参构造方法
LinkedList(Collection<? extends E> collection):
常用方法:
add(E e): 在最后添加元素
add(int index,E e): 在指定位置插入元素
remove(E e): 删除指定元素
remove(int index): 删除指定位置上的元素
get(int index): 查找指定位置上的元素
public class LinkedListSource {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("hello");
list.add("good");
list.add("yes");
/*
10个元素,找index为3的元素,从头开始找 0.next 1.next 2.next
找 index 为8的元素,从最后一个找 9.prev
*/
list.add(1,"ok");
}
}