首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java集合框架(二)-LinkedList

Java集合框架(二)-LinkedList

作者头像
化羽羽
发布2022-10-28 11:36:06
发布2022-10-28 11:36:06
3660
举报
文章被收录于专栏:化羽学Java化羽学Java

大佬理解->Java集合之ArrayList

1、LinkedList的特点

存放的元素有序

元素不唯一(可以重复)

随机访问慢

插入删除元素快

非线程安全

2、底层实现

底层实现是链表结构(双向链表),插入和删除元素的效率高(遍历元素和随机访问元素的效率低);

底层使用Node双向链表实现的

代码语言:javascript
复制
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;
    }
}

3、LinkedList初始化

代码语言:javascript
复制
// LinkedList包含首尾操作的特有方法,在list接口中没有定义,不推荐多态创建集合对象
// List<String> strList = new LinkedList<>();
// strList.addFirst();
LinkedList<String> linkedList = new LinkedList<>();

4、常用方法

方法

说明

add(E e)

添加元素(元素添加在链表末尾)

addFirst(E e)

在链表首添加元素

addLast(E e)

在链表末尾添加元素

getFirst()

获取第一个元素

getLast()

获取最后一个元素

removeFirst()

移除第一个元素

removeLast()

移除最后一个元素

size()

获取元素的总数

get(int index)

根据元素下标获取元素值

4.1 add(E e)

代码语言:javascript
复制
添加元素的普通方法:add(元素),将元素自动添加到链表的末尾

4.2 addFirst(E e)

代码语言:javascript
复制
addFirst(E e)添加到链表首部

4.3 addLast(E e)

代码语言:javascript
复制
addLast(E e)添加到链表首部

4.4 getFirst()

代码语言:javascript
复制
getFirst() 获取第一个元素

4.5 getLast()

代码语言:javascript
复制
getLast() 获取最后一个元素

4.7 removeFirst()

代码语言:javascript
复制
removeFirst() 删除第一个元素

4.8 removeLast()

代码语言:javascript
复制
removeLast() 删除最后一个元素

4.9 size()

代码语言:javascript
复制
size() 获取集合中元素个数方法

4.10 get(int index)

代码语言:javascript
复制
 1)获取的下标值必须是在有效的范围内:从0到元素个数-1之间,否则报错:IndexOutOfBoundsException;
 2)如果下标值在可以有效的范围内,自动进行二分法移动指针,先判断目标下标值在元素个数一半的前半段还是后半段;
    如果在前半段,自动从第一个节点开始,依次向后移动指针,直到找到下标位置,返回对应元素;
    如果在后半段,自动从最后一个节点,依次向前移动指针,直到找到指定下标位置,返回对应元素;
 所以:当下标位置越接近元素个数一半值(越靠近中间位置),效率是最低的,可以看出:遍历和随机访问的效率低;

源码

代码语言:javascript
复制
public E get(int index) {
    checkElementIndex(index); //判断下标是否大于集合元素总数
    return node(index).item; //返回结点值(元素)
}

//一个一个的往后找到指定的节点并返回
Node<E> node(int index) {
    // assert isElementIndex(index);

    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
        x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
        	x = x.prev;
        return x;
    }
}

5、ArrayList 和 LinkedList的区别

相同点

都是list的实现类,存放的元素都是有序,不唯一的,都是线程不安全的

不同点

1)底层实现不同:ArrayList底层实现是Object对象数组,而LinkedList底层是双向链表结构;

2)扩容机制不同:ArrayList默认是空的Object对象数组(也可以指定大于0的初识容量),首次自动扩容为10个长度,后续每次扩容原来容量的1.5倍,LinkedList底层是链表,没有容量,没有扩容,存放元素没限制;

3)使用场景不同:ArrayList适用于快速的遍历和随机访问元素,而LinkedList适用于快速的添加删除元素;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、LinkedList的特点
  • 2、底层实现
  • 3、LinkedList初始化
  • 4、常用方法
  • 5、ArrayList 和 LinkedList的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档