LinkedList测试
public static void main(String[] args) { List list = new LinkedList(); //添加元素 list.add(1); list.add(2); //在指定位置添加元素 list.add(0,0); System.out.println("list中的元素:" + list); //对象首次出现的位置 System.out.println("0对象首先出现的位置:"+list.indexOf(0)); //对象最后出现的位置 System.out.println("1对象首先出现的位置:"+list.lastIndexOf(1)); //for循环遍历 for (int i = 0;i < list.size();i++){ System.out.println("for循环遍历:" + list.get(i)); } //返回列表的长度 System.out.println("长度:" + list.size()); //迭代器遍历 Iterator it = list.iterator(); while (it.hasNext()){ System.out.println("迭代器遍历 :" + it.next() ); } //将对象添加在集合的开头 ((LinkedList) list).addFirst("a"); //将对象添加在集合的末尾 ((LinkedList) list).addLast("b"); System.out.println("list中的元素:" + list); //修改指定位置的对象 list.set(0,"c"); System.out.println("修改0位置的对象值为c:" + list); //获取集合中开头的元素 System.out.println("开头的元素:" + ((LinkedList) list).getFirst()); //获取集合中末尾的元素 System.out.println("末尾的元素:" + ((LinkedList) list).getLast()); //删除列表开头的元素 ((LinkedList) list).removeFirst();//删除的是a //删除列表末尾的元素 ((LinkedList) list).removeLast();//删除的是b System.out.println("删除开头和结尾之后的列表:" + list); //删除指定索引的位置 list.remove(0); System.out.println("删除指定索引位置的列表:" + list); //判断列表是否为空 System.out.println("是否为空:" + list.isEmpty()); //是否包含对象1 System.out.println("是否包含对象1 :" + list.contains(1)); //清空集合 list.clear(); }
相关底层的方法实现:
1、new对象之后List list = new LinkedList();
可以看作是一个双向的链表每个节点都有first节点和last节点
方法都是通过移动节点指向来实现的
transient int size = 0; transient Node<E> first; transient Node<E> last;
protected transient int modCount = 0;
public LinkedList() { }
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
2、add(E e)方法
public boolean add(E e) { linkLast(e); return true; }
void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null);//下方的类带有参数的构造器 last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }