8、集合--LinkedList的测试以及相关方法的源码分析

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;
        }
    }

猜你喜欢

转载自www.cnblogs.com/Mrchengs/p/10847242.html