总述
ArrayList和LinkedList都是直接实现List的接口,List的特点是有序集合(有序集合的意思是可直接通过索引直接访问,Set可以自动排序,元素不可重复,如果要对自定义的Object去重,那需要重写equals和hashCode方法,详情请看我的另一个博文),元素可重复,因此ArrayList和LinkedList也继承了这个特点。ArrayList是基于基础的对象数组动态实现的数据结构,它对于随机访问(random access)get和set,速度要比LinkedList速度要快。LinkedList是基于链表的数据结构,它使用get方法时是按照顺序从列表的一段开始检查,移动指针,直到另一端,但对于添加add和删除remove操作,LinkedList速度要占优势。
附录API
ArrayList
Return | method | explain |
---|---|---|
boolean | add(E e) | 将指定的元素添加到此列表的尾部 |
void | add(int index,E e) | 在此列表中指定的位置插入指定的元素 |
boolean | contains(Object o) | 如果此列表中包含指定的元素,则返回 true |
E | get(int index) | 返回此列表中指定位置上的元素 |
boolean | isEmpty() | 如果此列表中没有元素,则返回 true |
E | remove(int index) | 移除此列表中指定位置上的元素 |
int | size() | 返回此列表中的元素数 |
Object[] | toArray() | 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组 |
void | clear() | 移除此列表中的所有元素 |
LinkedList
Return | method | explain |
---|---|---|
boolean | add(E e) | 将指定的元素添加到此列表的尾部 |
void | add(int index, E element) | 在此列表中指定的位置插入指定的元素 |
void | clear() | 从此列表中移除所有元素 |
boolean | contains(Object o) | 如果此列表包含指定元素,则返回 true |
E | get(int index) | 返回此列表中指定位置处的元素 |
E | remove(int index) | 移除此列表中指定位置处的元素 |
int | size() | 返回此列表的元素数 |
E | set(int index, E element) | 将此列表中指定位置的元素替换为指定的元素 |
Object[] | toArray() | 返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组 |
boolean | isEmpty() | 如果此列表中没有元素,则返回 true |
从API中看一看出:ArrayList和LinkedList方法基本相同,插入一个元素到集合中,两个集合都提供了add(int index,E element):void方法,并且LinkedList又提供set(int index,E element):E方法,它们的差别主要是效率问题,有兴趣可以自己测试一下
代码实现
ArrayList
// 测试add方法
List<Integer> arrayList = new ArrayList<>();
// 添加6数据
arrayList.add(20);
arrayList.add(25);
arrayList.add(8);
arrayList.add(35);
arrayList.add(38);
arrayList.add(2, 100);
for (Integer integer : arrayList) {
System.out.print(integer + " ");
}
// 测试contains方法
if (arrayList.contains(25)) {
System.out.println("\r\ntrue");
}
// 测试get方法
System.out.println(arrayList.get(2));
// 测试isEmpty方法
if (!arrayList.isEmpty()) {
System.out.println("is not empty");
}
// 测试remove方法
arrayList.remove(2);
for (Integer integer : arrayList) {
System.out.print(integer + " ");
}
// 测试size方法
System.out.println("\r\n" + arrayList.size());
// 测试toArray方法
Object[] ig = arrayList.toArray();
for (Object obj : ig) {
System.out.print((Integer) obj + " ");
}
// 测试clear方法
arrayList.clear();
System.out.println("\r\n" + arrayList.size());
运行结果
20 25 100 8 35 38
true
100
is not empty
20 25 8 35 38
5
20 25 8 35 38
0
LinkedList
List<Integer> linkedList = new java.util.LinkedList<>();
// 测试add方法
linkedList.add(56);
linkedList.add(78);
linkedList.add(59);
linkedList.add(77);
linkedList.add(2, 100);
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
// 测试contains方法
if (linkedList.contains(78)) {
System.out.println("\r\ntrue");
}
// 测试get方法
System.out.println(linkedList.get(1));
// 测试remove方法
System.out.println(linkedList.remove(2));
// 测试size方法
System.out.println(linkedList.size());
// 测试set方法
linkedList.set(2, 200);
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
// 测试isEmpty方法
if (!linkedList.isEmpty()) {
System.out.println("\r\ntrue");
}
// 测试toArray()方法
Object obj = linkedList.toArray();
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
运行结果
56 78 100 59 77
true
78
100
4
56 78 200 77
true
56 78 200 77
应用场景
如果对集合的增删改的操作频繁,那就使用LinkedList,如果对集合进行频繁的随机访问,就使用ArrayList。