java集合之LinkedList详解

按照之前的套路,还是先研究一下源码啦~ 这样就能对它的实现以及方法等等有一个详细的理解,虽然看源码比较头疼,但是!!!还是得看的!!!人家为什么是源码呢??大神的思路当然值得我们学习了 ~o(╥﹏╥)o

一、继承关系

在这里插入图片描述
可以看见它实现了Deque接口,所以具有队列先进先出的特征。
并且因此还提供了特殊的方法,比如从头或者尾进行添加、删除、获取

二、基本属性
transient int size = 0;  //集合中元素个数
transient Node<E> first; //头结点
transient Node<E> last; //尾结点
三、底层数据结构

在这里插入图片描述
所以呢 底层数据是一个双向链表

四、构造函数
  • 无参构造函数
    在这里插入图片描述
  • 有参构造函数
    在这里插入图片描述
五、CRUD方法研究
1、add():添加元素

在这里插入图片描述
在这里插入图片描述
LinkedList提供头插,尾插方式插入节点,但是默认采用的是尾插 。

2、get():获取元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果要获取index位置上的元素,先看是否小于size的一半,如果小于从0号开始查找,否则从size-1开始查找

3、remove():删除元素
    public boolean remove(Object o) {
    //判断元素是否为null进行不同的判等处理
    //删除元素从前往后删除,重复性元素直接删除第一个节点
        if (o == null) {  //为空用==
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null) {
                    unlink(x);
                    return true;
                }
            }
        } else {
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item)) { //不为空用equals
                    unlink(x);
                    return true;
                }
            }
        }
        return false;
    }
    E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;
        
        //前驱prev分两种情况:一种是first节点,一种非first节点
        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }
        
        //后继next分两种情况:一种是last节点,一种是非last节点
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }
        
		//将元素置为null
        x.item = null;
        size--;
        modCount++;
        return element;
    }
六、LinkedList应用实例
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        linkedList.add(null);
        linkedList.add(3);

        System.out.println(linkedList);

        System.out.println("0号下标的元素为:"+linkedList.get(0));
        System.out.println("删除3号元素,再次遍历:");
        linkedList.remove(Integer.valueOf(3));

        Iterator<Integer> iterator = linkedList.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next()+" ");
        }
    }
}

在这里插入图片描述

七、ArrayList与LinkedList的异同点
相同点
  • 继承关系: 都是List接口下的实现类,具有list提供的所有方法
  • 有序性: 数据都是按照插入有序
  • 重复性: 集合中元素都是可以重复的
  • null值: 都可以存储 null值
  • 安全性: 都是非线程安全的集合
不同点
  • 底层数据结构: ArrayList底层是数组,LinkedList底层是链表(双向链表)
  • 特有方法: LinkedList具有特有的方法,例如:addFirst、addLast…(因为多实现了一个Deque接口)
  • 效率: ArrayList查询效率高O(1),LinkedList添加O(1)、删除效率高。
    ArrayList添加元素趋近于O(1),在不扩容情况下就是O(1)
  • 应用场景: ArrayList在查询较高的业务场景优先考虑,LinkedList在修改、添加等操作较多的场景下优先考虑
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值