当前位置: 首页 > news >正文

韩国私人网站服务器交换链接

韩国私人网站服务器,交换链接,成品网站货源1688免费,美国最近的新闻大事1、背景 我们咨询一下腾讯混元大模型,什么是“LinkedList”。 以下是混元大模型的回答: LinkedList 是 Java 集合框架中的一种数据结构,它实现了 List 和 Deque 接口。LinkedList 是一个双向链表,这意味着每个元素都包含对前一个和…

1、背景

我们咨询一下腾讯混元大模型,什么是“LinkedList”。

62f25fb6619601694c15b95068e64b31.png

以下是混元大模型的回答:

LinkedList 是 Java 集合框架中的一种数据结构,它实现了 List 和 Deque 接口。LinkedList 是一个双向链表,这意味着每个元素都包含对前一个和后一个元素的引用。
这种数据结构允许在列表的两端进行高效的插入和删除操作。

LinkedList 的主要特点:

  1. 动态大小:与数组不同,LinkedList 的大小可以动态增长或缩小。

  2. 高效的插入和删除:在 LinkedList 的开头、结尾或中间插入或删除元素时,不需要移动其他元素,因此这些操作通常比在 ArrayList 中执行得更快。

  3. 内存效率:由于不需要连续的内存空间来存储元素,LinkedList 在内存使用上可能比 ArrayList 更有效。

  4. 访问速度:与 ArrayList 相比,LinkedList 的随机访问速度较慢,因为需要从头部或尾部开始遍历链表才能找到特定位置的元素。

  5. 线程不安全:LinkedList 不是线程安全的。如果多个线程同时修改 LinkedList,可能会导致数据不一致。在多线程环境中,可以使用 Collections.synchronizedList() 方法将 LinkedList 包装成线程安全的列表,或者使用 CopyOnWriteArrayList(尽管它更适合读多写少的场景)。

2、源码分析

2.1类定义

public class LinkedList<E>extends AbstractSequentialList<E>implements     List<E>, Deque<E>, Cloneable, java.io.Serializable
{}

源码分析:

  • LinkedList 继承了AbstractSequentialList

    • AbstractSequentialList 是 Java 集合框架中的一个抽象类,它实现了 List 接口并提供了一个顺序访问列表元素的迭代器。AbstractSequentialList 为那些希望以顺序方式访问其元素的列表提供了一个通用的基础实现。

  • LinkedList 实现了List接口:具备线性表的操作,如:

    • size、isEmpty、contains、containsAll

    • add、addAll、removeAll、retainAll、clear、subList

  • LinkedList 实现了Deque接口:具备双向链表的操作,如:

    • addFirst、removeFirst、pollFirst、getFirst、peekFirst

    • addLast、removeLast、pollLast、getLast、peekLast

2.2基本属性

transient int size = 0;/*** Pointer to first node.*/
transient Node<E> first;/*** Pointer to last node.*/
transient Node<E> last;/** 修改次数 */
protected transient int modCount = 0;

源码分析:

  • LinkedList 内置了两个指针,包括头结点first和末尾指针last

  • LinkedList 也设置了size,标识有效元素数量(不包括头结点和末尾指针)

  • LinkedList设置了modCount,标识修改操作次数,modCount字段用于跟踪列表的结构修改次数,以确保在迭代过程中发生并发修改时能够快速失败,会直接触发异常ConcurrentModificationException

2.3 基本操作:增删改查

(1)增加元素

f40f2ce211f93208c7deb6d800cd3abf.png

通过阅读源码,LinkedList有7种添加元素方法,

  1. add(E e):在列表的末尾添加一个元素(默认在列表的末尾添加,即尾插法)

  2. add(int index, E element):在指定位置插入一个元素。

  3. addFirst(E e):在列表的开头添加一个元素。

  4. addLast(E e):在列表的末尾添加一个元素(与 add(E e) 相同)。

  5. push(E e):在列表的开头添加一个元素(与 addFirst(E e) 相同)。

  6. addAll的两个重载方法:则是批量插入元素

解析 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;elsel.next = newNode;size++;modCount++;
}Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;
}

c1b5972e893379332f2289cad8441377.png

源码分析:

  • linkLast(e):尾插法

  • 新建Node节点:前继指针指向last,当前数据为e,后继指针为null

  • 容量size+1,修改次数+1

(2)删除元素

02fd71241a3ae26da12e68bd6ef61fa8.png

解析remove()方法源码

源码分析:

public E remove() {return removeFirst();
}public E removeFirst() {final Node<E> f = first;if (f == null)throw new NoSuchElementException();return unlinkFirst(f);
}private E unlinkFirst(Node<E> f) {// assert f == first && f != null;final E element = f.item;// 【1】final Node<E> next = f.next;// 【2】f.item = null;// 【3】f.next = null; // help GC// 【4】first = next;// 【5】if (next == null)last = null;else// 【6】next.prev = null;// 【7】size--;modCount++;// 【8】return element;
}

源码解析:

  1. 中间变量:next局部变量 承载被删节点的next指针(下个元素地址)

  2. 设置被删节点的item数值为null

  3. 设置被删节点的next指针为null

  4. 设置first指针为next局部变量 (下个元素地址)

  5. 如果next局部变量为null,说明没有元素了,顺带设置last为null

  6. 否则设置next局部变量 的前继指针为null,因为此后next局部变量 的元素为头结点了

  7. 容量-1,操作次数+1

  8. 返回被删数据

(3)修改元素

db21d61a967de64419cf92b6f31025f7.png

更新set()方法源码
public E set(int index, E element) {// 【1】checkElementIndex(index);// 【2】Node<E> x = node(index);// 【3】E oldVal = x.item;// 【4】x.item = element;// 【5】return oldVal;
}Node<E> node(int index) {// assert isElementIndex(index);// 【2.1】右移位运算,size/2if (index < (size >> 1)) {// 【2.2】Node<E> x = first;// 【2.3】从头部进行遍历for (int i = 0; i < index; i++)// 【2.4】x = x.next;// 【2.5】return x;} else {// 【2.6】从尾部进行遍历Node<E> x = last;for (int i = size - 1; i > index; i--)// 【2.7】x = x.prev;// 【2.8】return x;}
}private void checkElementIndex(int index) {if (!isElementIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}private boolean isElementIndex(int index) {return index >= 0 && index < size;
}

源码分析:

  1. 检查元素是否合法,不合法抛出异常IndexOutOfBoundsException

  2. 通过遍历链表,得到元素地址

    1. 计算要更新的索引下标,离first更近,还是离last更近

    2. 离first更近,从头部开始遍历,for循环遍历,得到前一个元素的next指向的元素地址

    3. 离last更近,从尾部开始遍历,for循环遍历,得到后一个元素的prev指向的元素地址

  3. 获取更新前数值

  4. 更新新数值

  5. 返回更新前数值

(4)获取元素

56d6c464f7f291fda5adece909006ead.png

获取某个索引下标get()方法源码
public E get(int index) {// 【1】checkElementIndex(index);// 【2】return node(index).item;
}private void checkElementIndex(int index) {if (!isElementIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}Node<E> node(int index) {// assert isElementIndex(index);// 【2.1】右移位运算,size/2if (index < (size >> 1)) {// 【2.2】Node<E> x = first;// 【2.3】从头部进行遍历for (int i = 0; i < index; i++)// 【2.4】x = x.next;// 【2.5】return x;} else {// 【2.6】从尾部进行遍历Node<E> x = last;for (int i = size - 1; i > index; i--)// 【2.7】x = x.prev;// 【2.8】return x;}
}

源码解析:

(会发现,其实获取元素的逻辑,就是修改元素的前置操作)

  1. 检查元素是否合法,不合法抛出异常IndexOutOfBoundsException

  2. 通过遍历链表,得到元素地址

    1. 计算要更新的索引下标,离first更近,还是离last更近

    2. 离first更近,从头部开始遍历,for循环遍历,得到前一个元素的next指向的元素地址

    3. 离last更近,从尾部开始遍历,for循环遍历,得到后一个元素的prev指向的元素地址

3、总结

LinkedList 是一个双向链表,这意味着每个元素都包含对前一个和后一个元素的引用。这种数据结构允许在列表的两端进行高效的插入和删除操作。

3.1 ArrayList和LinkedList比较

  1. ArrayList底层基于动态数组实现,LinkedList底层基于链表实现

  2. 对于随机访问(get/set方法),ArrayList通过index直接定位到数组对应位置的节点,而LinkedList需要从头结点或尾节点开始遍历,直到寻找到目标节点,因此在效率上ArrayList优于LinkedList

  3. 对于插入和删除(add/remove方法),ArrayList需要移动目标节点后面的节点(使用System.arraycopy方法移动节点),而LinkedList只需修改目标节点前后节点的next或prev属性即可,因此在效率上LinkedList优于ArrayList。

http://www.zhongyajixie.com/news/14913.html

相关文章:

  • 幼儿园班级网站建设济南网站设计
  • 武汉地铁计划建设在哪个网站查西地那非片
  • wordpress百家徐州seo外包公司
  • 刘强东最开始在哪个平台做网站seo网站免费优化软件
  • 做网站推广 seo的蜗牛精灵seo
  • 开发网站网络公司排行天津做优化好的公司
  • 一元云购网站黑客攻击网站优化费用报价明细
  • 学校网站开发报价表网络广告营销
  • 建设银行银监会官方网站自媒体平台注册下载
  • 网站建设的费用是多少钱怎么建立企业网站免费的
  • it运维前景怎么样惠州seo博客
  • 公司网站建设找谁网站建设公司业务
  • 江苏宏澄建设有限公司网站qq群排名优化软件购买
  • 专业营销的网站建设公司百度关键词怎么做排名
  • 烟台正规网站建设seo工具不包括
  • 怎么做网站的自然排名深圳百度推广seo公司
  • 做网站模板 优帮云b站入口2024已更新
  • 做外贸在哪个网站注册谷歌浏览器下载
  • ps与dw怎么做网站千锋教育培训收费一览表
  • wordpress的paypal插件电脑网络优化软件
  • 湖南省水利水电建设工程学校网站湖北百度推广电话
  • 攸县住房和城乡规划建设局网站南宁网站制作
  • 网站推广优化联系方式视频推广渠道有哪些
  • 网站营销工作流程qq群排名优化软件
  • 沈阳网站设计制作广东省最新新闻
  • 网站网页直播怎么做百度指数三个功能模块
  • 哪些网站做财金的好电销名单渠道在哪里找
  • 企业网站开发工资学校网站建设
  • 仿蘑菇街wordpress主题优化网站seo方案
  • 商城网站建设计划书兰州网站seo服务