1.特点
链表,两端效率高,底层就是链表实现的
List接口的实现类,底层的数据结构为链表,内存空间是不连续的
- 元素有下标,有序
- 允许存放重复的元素
- 在数据量较大的情况下,查询慢,增删快
2.常用方法
LinkedList中,有很多方法可以看作是重复的方法,例如offer
和offerLast
方法,从用法和效果来说,完全是一样的。增加它的目的,是在Java 6版本增加了Deque接口
后,为了实现双端队列,需要增加-first
和 -last
变体,也就要增加offerFirst
和offerLast
。(Deque继承Queue,而Queue是单端队列,先进后出,所以只有offer()
和add()
方法)为了用冗余换对称性——例如add/addFirst/addLast
,如果offer
有offer
和offerFirst
,却没有offerLast
,就没有“编程之美”了——所以还是增加了一个offerLast()
。
2.1 添加元素
void addFirst(E e)
:添加首元素 ,并返回被添加的首元素void addLast(E e)
:添加尾元素 ,并返回被添加的首元素boolean offer(E e)
:添加尾元素 ,并返回被添加的尾元素boolean offerFirst(E e)
:添加首元素 ,并返回被添加的首元素boolean offerLast(E e)
:添加尾元素 ,并返回被添加的尾元素
2.2 删除元素
E remove(int index / Object o)
:删除指定的元素,如果指定下标,则返回被删除的元素,如果指定元素,则返回true,如果指定的下标或元素不存在,则返回falseE removeFirst()
:删除首元素 ,并返回被删除的元素,当删除不存在的元素时,会抛出NoSuchElementException
异常E removeLast()
:删除尾元素 ,并返回被删除的元素,当删除不存在的元素时,会抛出NoSuchElementException
异常E poll()
:返回并移除头元素 ,并返回被移除的元素,当移除不存在的元素时,会返回nullE pollFirst()
:返回并移除头元素 ,并返回被移除的元素,当移除不存在的元素时,会返回nullE pollLast()
:返回并移除尾元素 ,并返回被移除的元素,当移除不存在的元素时,会返回null
2.3 获取元素
E element()
:获取首元素,如果集合为空,会抛出异常NoSuchElementException
异常E get(int index)
:获取指定下标的元素 ,如果下标超过集合长度,会抛出IndexOutOfBoundsException
异常E getFirst()
:获取首元素 ,如果集合为空,会抛出异常NoSuchElementException
异常E getLast()
:获取尾元素 ,如果集合为空,会抛出异常NoSuchElementException
异常E peek()
:获取首元素 ,如果集合为空,会返回nullE peekFirst()
:获取首元素 ,如果集合为空,会返回nullE peekLast()
:获取尾元素 ,如果集合为空,会返回null
3.练习:LinkedList测试
package partThree;
import java.util.LinkedList;
/*本类用于测试LinkedList方法的使用*/
public class TestLinkedList {
public static void main(String[] args) {
System.out.println("--------创建List集合并添加元素---------");
System.out.println();
//1.创建集合对象
LinkedList<String> list = new LinkedList<>();
//2.向集合中添加数据
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
System.out.println("打印添加的所有元素:"+list);
System.out.println();
System.out.println("------------测试在以创建集合中添加元素--------------");
System.out.println();
//3. 测试LinkedList添加元素的方法
list.addFirst("addFirst");//添加首元素,返回添加的元素addFirst
list.addLast("addLast");//添加尾元素,返回添加的元素addLast
System.out.println("打印添加元素后的list"+list);
list.offer("offer");//添加尾元素,返回添加的元素offer
list.offerFirst("offerFirst");//添加首元素,返回添加的元素offerFirst
list.offerLast("offerLast");//添加尾元素,返回添加的元素offerLast
System.out.println("打印添加元素后的list"+list);
System.out.println();
System.out.println("------------测试在已创建集合中移除元素--------------");
System.out.println();
//4. 测试LinkedList移除元素的方法
System.out.println("使用removeFirst移除首元素:"+list.removeFirst());//移除首元素,成功移除会返回移除的元素
System.out.println("打印移除元素后的list:"+list);//打印移除后剩余的元素
System.out.println("使用removeLast移除尾元素:"+list.removeLast());//移除尾元素,成功移除会返回移除的元素
System.out.println("打印移除元素后的list:"+list);//打印移除后剩余的元素
System.out.println("使用poll移除尾元素:"+list.poll());//移除尾元素,成功移除会返回移除的元素
System.out.println("打印移除元素后的list:"+list);//打印移除后剩余的元素
System.out.println("使用pollFirst移除首元素:"+list.pollFirst());//移除首元素,成功移除会返回移除的元素
System.out.println("打印移除元素后的list:"+list);//打印移除后剩余的元素
System.out.println("使用pollLast移除尾元素:"+list.pollLast());//移除尾元素,成功移除会返回移除的元素
System.out.println("打印移除元素后的list:"+list);//打印移除后剩余的元素
System.out.println();
System.out.println("------------测试在创建的空集合中移除元素--------------");
System.out.println();
//5. 测试LinkedList在空集合中移除元素的方法
LinkedList<String> nullList = new LinkedList<>();
System.out.println("使用poll移除尾元素:"+nullList.poll());//移除尾元素,移除位置u没有元素会返回null
System.out.println("打印移除元素后的list:"+nullList);//打印移除后剩余的元素
//System.out.println("使用removeFirst移除首元素:"+nullList.removeFirst());//移除首元素,移除位置u没有元素会抛出NoSuchElementException异常
System.out.println("打印移除元素后的list:"+nullList);//打印移除后剩余的元素
System.out.println();
System.out.println("------------测试在已创建集合中获取元素--------------");
System.out.println();
//6. 测试LinkedList获取元素方法
System.out.println("使用element获取首元素:"+list.element());//获取首元素 可以直接写到打印语句中,也可以单独写
System.out.println("使用getFirst获取首元素:"+list.getFirst());//获取首元素 可以直接写到打印语句中,也可以单独写
System.out.println("使用getLast获取尾元素:"+list.getLast());//获取尾元素 可以直接写到打印语句中,也可以单独写
System.out.println("使用peek获取首元素:"+list.peek());//获取尾元素
System.out.println("使用pollFirst获取首元素:"+list.pollFirst());//获取首元素
System.out.println("使用peekLast获取首元素:"+list.peekLast());//获取尾元素
//6. 测试LinkedList获取元素方法在空集合中的返回值
//System.out.println("使用element获取空集合的首元素:"+nullList.element()); //会抛出异常NoSuchElementException
//System.out.println("使用getFirst获取空集合的首元素:"+nullList.getFirst()); //会抛出异常NoSuchElementException
System.out.println("使用peek获取空集合的首元素:"+nullList.peek()); //返回null
}
}