在学习LinkedList之前应该先了解ArrayList
ArrayList用法
ArrayList的基本增删改查方法LinkedList都适用
常用方法
- 返回链表的第一个(最后一个)元素但不删除元素
list.getFirst()-------list.getLast()
list.peek()
list.peekFirst()--------list.peekLast()
list.element() - 返回链表的第一个(最后一个)元素并且删除该元素
list.pop()
list.pollFirst()---------list.pollLast()
list.poll() - 在链表的第一个/最后一个位置添加元素
list.offer()——返回true
list.offerFirst()--------list.offerLast()——返回true
list.push()
list.addFirst()-----------list.addLast() - 移除第一次出现的目标元素,如果移除则返回true,如果没有该元素则返回false
list.removeFirstOccurrence()----------list.removeLastOccurrence()
这里主要将两者进行对比
效率对比
①当同时对向个数组末尾添加元素的时候,也就是用list.add()方法
public static void main(String[] args) {
List<Integer> arraylist=new ArrayList<Integer>();
List<Integer> linkedlist=new LinkedList<Integer>();
long t1=System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
arraylist.add(i);
}
long t2=System.currentTimeMillis();
System.out.println("在数组末尾插入二十万个数据,ArrayList所花的时间为:"+(t2-t1)+"ms");
long t3=System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
linkedlist.add(i);
}
long t4=System.currentTimeMillis();
System.out.println("在数组末尾插入二十万个数据,LinkedList所花的时间为:"+(t4-t3)+"ms");
}
可以看到,当在末尾添加元素的时候,两者效率几乎一样
②当同时对向个数组末尾添加元素的时候,也就是用list.add(index,element)方法
public static void main(String[] args) {
List<Integer> arraylist=new ArrayList<Integer>();
List<Integer> linkedlist=new LinkedList<Integer>();
long t1=System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
arraylist.add(0,i);
}
long t2=System.currentTimeMillis();
System.out.println("在指定位置插入二十万个数据,ArrayList所花的时间为:"+(t2-t1)+"ms");
long t3=System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
linkedlist.add(0,i);
}
long t4=System.currentTimeMillis();
System.out.println("在指定位置插入二十万个数据,LinkedList所花的时间为:"+(t4-t3)+"ms");
}
可以看到,当在指定位置插入元素得时候,ArrayList的效率就明显的低于LinkedList的效率了。所以,当程序中大量插入数据操作时,用LinkList更好
③随机查询比较,list.get(index)方法
public static void main(String[] args) {
List<Integer> arraylist=new ArrayList<Integer>();
List<Integer> linkedlist=new LinkedList<Integer>();
for (int i = 0; i < 20000000; i++) {
arraylist.add(i);
}
for (int i = 0; i < 20000000; i++) {
linkedlist.add(i);
}
long t1=System.currentTimeMillis();
System.out.println(arraylist.get(14346562));
long t2=System.currentTimeMillis();
System.out.println("查找指定位置的数,ArrayList所花的时间为:"+(t2-t1)+"ms");
long t3=System.currentTimeMillis();
System.out.println(linkedlist.get(14346562));
long t4=System.currentTimeMillis();
System.out.println("查找指定位置的数,LinkedList所花的时间为:"+(t4-t3)+"ms");
}
可以看到,当进行随机访问的时候,ArrayList相比LinkedList的效率是非常快的。
④删除元素 list.remove();
public static void main(String[] args) {
List<Integer> arraylist=new ArrayList<Integer>();
List<Integer> linkedlist=new LinkedList<Integer>();
for (int i = 0; i < 20000000; i++) {
arraylist.add(i);
}
for (int i = 0; i < 20000000; i++) {
linkedlist.add(i);
}
int i=15689;//这里用了很多数据
long t1=System.currentTimeMillis();
arraylist.remove(i);
long t2=System.currentTimeMillis();
System.out.println("删除指定位置的数,ArrayList所花的时间为:"+(t2-t1)+"ms");
long t3=System.currentTimeMillis();
linkedlist.remove(i);
long t4=System.currentTimeMillis();
System.out.println("删除指定位置的数,LinkedList所花的时间为:"+(t4-t3)+"ms");
}
经过多次测试,发现两者的效率孰优孰劣并不是绝对的,两者的remove效率取决于元素所在的位置,当元素所在位置在数组靠前时,Linkedlist效率优于ArrayList,往后面,ArrayList的效率优于LinkedList。(这里不确定是否正确,自己测试的和书上说的有出入,希望有大佬能解决这个问题并给个权威的答复)
数据位置靠前时
数据位值靠后时