Java基础学习——Java集合(五)LinkedList实现类

一、LinkedList实现类

1.概念:Linked意为链表

2.常用方法

1)增:addFirst(E e)、addLast(E e) offer(E e)

             offerFirst(E e)、offerLast(E e)

2)删:poll()、pollLast() JDK1.6才有,相比remove提高了代码的健壮性

             removeFirst()、removeLast() //remove一般不使用,因为对于空的集合,删除会报错NoSuchElementException,这是JDK1.0就有的老方法

3)改:

4)查:elelment()

             getFirst()、getLast()

             indexOf(Object o)、LastIndexOf(Object o)

             peek()、peekFirst()、peekLast()

5)判断:继承Collection和List

代码应用

package com.rzd.no03collection;


import java.util.Iterator;
import java.util.LinkedList;

public class Demo11 {
    public static void main(String[] args) {
        //先创建一个LinkedList对象,点进LinkedList源码可以看到这是一个泛型类,所以我们可以给它任意定义一个泛型
        LinkedList<String> list = new LinkedList();

        //常用方法
        System.out.println("增:");
        /*1.增:addFirst(E e)、addLast(E e)
               offer(E e)、offerFirst(E e)、offerLast(E e)
         */
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("bb"); //LinkedList可以添加重复数据
        System.out.println(list);   //[aa, bb, cc, bb]
        //在集合头添加元素:addFirst(E e)、offerFirst(E e)
        list.addFirst("first");
        System.out.println(list);   //[first, aa, bb, cc, bb]
        list.offerFirst("offirst"); //[offirst, first, aa, bb, cc, bb, last]
        //在集合尾添加元素:addLast(E e)、offer(E e)、offerLast(E e)
        list.addLast("last");
        System.out.println(list);  //[offirst, first, aa, bb, cc, bb, last]
        list.offer("off");
        System.out.println(list);   //[offirst, first, aa, bb, cc, bb, last, off]
        list.offerLast("oflast");
        System.out.println(list);   //[offirst, first, aa, bb, cc, bb, last, off, oflast]

        System.out.println("删:");
        /*2.删:poll()、pollLast()  JDK1.6才有,相比remove提高了代码的健壮性
               removeFirst()、removeLast() //remove一般不使用,因为对于空的集合,删除会报错NoSuchElementException,这是JDK1.0就有的老方法
         */
        //删除头:poll()、list.pollFirst();
        list.poll();    //删除了offirst
        System.out.println(list);   //[first, aa, bb, cc, bb, last, off, oflast]
        System.out.println(list.poll());    //可以返回被删除的元素 first
        list.pollFirst();
        System.out.println(list);   //[bb, cc, bb, last, off, oflast]
        list.removeFirst();
        System.out.println(list);   //[cc, bb, last, off, oflast]

        //删除尾:
        list.pollLast();
        System.out.println(list);   //[cc, bb, last, off]

        //list.clear();   //清空集合

        System.out.println("查:");
        /*3.查:elelment()
               getFirst()、getLast()
               indexOf(Object o)、LastIndexOf(Object o)
               peek()、peekFirst()、peekLast()
        */
        //遍历LinkedList
        //1.普通for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //2.增强for循环
        for (String s:list){
            System.out.println(s);
        }
        //iteractor
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        //iteractor的for循环写法,节省内存,因为it1在for循环结束后就自动销毁了,而上面的it要整个方法结束才会结束
        for (Iterator<String> it1 = list.iterator();it.hasNext();){
            System.out.println(it.next());
        }

        System.out.println("判断:");
        //4.判断
    }
}

这里需要注意的是,对于遍历,之前我们写的

Iterator<String> it = list.iterator();
while (it.hasNext()){
    System.out.println(it.next());
}

可以有更节省内存的写法,源码中会使用这种写法:

for (Iterator<String> it1 = list.iterator();it.hasNext();){
    System.out.println(it.next());
}

二、LinkedList源码分析

1.简要底层原理图

2.源码分析

1)泛型类,E具体的类型在实例化时才会确定

2)size是集合中元素的数量

 

3)first、last是链表的首节点和尾节点

并且类中有一个内部类Node,定义了一个节点中3个属性item:当前元素内容、next:下一个元素的地址、prev:上一个元素的地址

 

 4)空构造器

 5)add()方法,这里的E在实例化的时候确定,并且这个方法添加成功会返回boolean型结果true

linklast()是真正执行添加操作的方法

下面依次添加add(111)、add(222)、add(333)

 

 后面依次类推,代码解析如下

        void linkLast(E e) { 
            final Node<E> l = last; //将链表中的last元素给l,如果是第一个元素,则last=l=null
            final Node<E> newNode = new Node<>(l, e, null); //将元素封装为一个Node对象
                last = newNode;//将链表中的last节点指向新创建的Node对象,因为这个新创建的肯定是最后一个节点
                if (l == null)
                    first = newNode; //如果是第一个元素,那么链表中的first就指向新创建的这个节点
                else
                    l.next = newNode;//如果不是第一个元素,那么将l的next指向为新创建的这个节点的地址,也就是将上一个元素的next指向了下一个节点的地址
                size++; //结合中元素数量+1
                modCount++;
        }

6)size()方法获得集合中元素数量

 7)通过索引得到元素

解析如下

 上述源码需要用到的代码

import java.util.LinkedList;

public class Demo12 {
    public static void main(String[] args) {
        //先创建一个LinkedList对象,点进LinkedList源码可以看到这是一个泛型类,所以我们可以给它任意定义一个泛型
        LinkedList<Integer> list = new LinkedList();
        list.add(111);
        list.add(222);
        list.add(333);
        list.add(444);
        list.add(555);
        list.add(666);
        System.out.println(list);
        list.get(2);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值