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

网站图片左右滚动惠州seo外包公司

网站图片左右滚动,惠州seo外包公司,厦门seo公司网站,免费图片在线生成LinkedList是List家族除ArrayList之外最为常用的另一成员&#xff0c;今天一文彻底搞懂LinkedList。 底层数据结构 LinkedList底层是一个双向链表&#xff1a; transient Node<E> first; transient Node<E> last;private static class Node<E> {E item;Node&…

LinkedList是List家族除ArrayList之外最为常用的另一成员,今天一文彻底搞懂LinkedList。

底层数据结构

LinkedList底层是一个双向链表:

transient Node<E> first;
transient Node<E> last;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;}}

数据存储在Node对象的item中,并保留指向上一节点、下一节点的对象。

再为整个LinkedList定义首节点first,尾结点last,方便对LinkedList的正向或逆向访问。

LinkedList的容量

不使用数组存储数据,所以不存在容量的概念,可以无限存入。

数据存入

add(E e)/addlast(E e):追加数据到链表尾部。
addfirst(E e):追加数据到链表头部。
push(E e):压栈,等同于addfirst。
add(int index, E element):追加数据到链表指定位置。
addAll(Collection<? extends E> c):追加集合c中的所有数据到链表尾部。
addAll(int index,Collection<? extends E> c):追加集合c中的所有数据到链表指定位置。

获取数据

contains(Object o):判断链表是否包含目标对象。
peek():获取链表第一个对象,并且不从链表中移除对象(不出栈)。
get(int index):获取指定位置对象。
pop():获取链表第一个数据并出栈。
removeFirst():等同于pop。

get方法的时间复杂度?

不读源码的前提下,我们可以先猜测一下LinkedList获取指定位置元素的get(int index)方法的时间复杂度。LinkedList是一个双向列表,获取指定位置元素的唯一方法就是遍历,理论上的时间复杂度就是O(n),n是列表长度。

我们看一下源码:

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

node(int index)方法其实还是用一种简单的方法提高了下遍历的性能:判断index是出于列表的前半部分、还是后半部分,出于前半部分则从表头first开始遍历,处于后半部分就从表尾last遍历。所以严格说LinkedList的get(int index)方法的时间复杂度是O(n/2),虽然O(n)和O(n/2)在表述上其实没有什么太大区别,但是通过读源码知道这个细节,在你自己的应用中如果有类似场景的话,你可以用这样的方式(虽然并非并非显著)提高性能。

transient 关键字

可以看到LinkedList的属性size、first、last的定义加了关键字transient ,顺便简单了解一下transient 的作用。

个人认为transient 其实可以忽略,因为对代码运行逻辑没有任何影响,一般情况下,对性能也没有太大影响。transient 关键字只在序列化及反序列化时生效:序列化的时候忽略transient 关键字修饰的字段,他们不会被序列化,从而节约序列化过程中的时间和存储空间开销。所以我们其实可以猜测使用transient 关键字的一个基本要求:这些字段在序列化的时候不需要包含,那么,一定是通过现有的已序列化的其他数据、在反序列化的过程中可以计算出来。

检查下LinkedList的:

private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {// Write out any hidden serialization magics.defaultWriteObject();// Write out sizes.writeInt(size);// Write out all elements in the proper order.for (Node<E> x = first; x != null; x = x.next)s.writeObject(x.item);}/*** Reconstitutes this {@code LinkedList} instance from a stream* (that is, deserializes it).*/@SuppressWarnings("unchecked")private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {// Read in any hidden serialization magics.defaultReadObject();// Read in sizeint size = s.readInt();// Read in all elements in the proper order.for (int i = 0; i < size; i++)linkLast((E)s.readObject());}

在反序列化(readObject方法)的过程中,size和first、last都会被计算出来。

总结:由于LinkedList是双向链表结构,实现了Deque接口,提供了一系列非常方便的队列操作方法,所以,如果有类似比如先进先出、先进后出等队列操作需求的场景,LinkedList是首选。

http://www.dtcms.com/wzjs/43139.html

相关文章:

  • 网站为什么做版心限制软文300字介绍商品
  • 青岛即墨网站开发优化快速排名公司
  • 网站制作网站价格seo网站优化工具大全
  • 什么是网站名google搜索
  • 阿里云突发性能适用于做网站吗宁波网络推广公司有哪些
  • 网站建设时间规划竞价广告是什么意思
  • 专门做品牌折扣的网站青岛seo计费
  • 网站建设的技术指标河源今日头条新闻最新
  • 网站开发需要提供哪些资料快速建站哪个平台好
  • 清河网站制作网络营销的方式有几种
  • 改图网网站谁做的如何分步骤开展seo工作
  • 青岛做网站的大公司有站长工具网站备案查询
  • 广州软件制作公司谷歌seo技巧
  • 网上做外贸都有哪些网站百度搜索app免费下载
  • 广东网站建设包括什么软件上海网络推广招聘
  • 公司做网站 手机 电脑网站推广排名教程
  • 韶关市住房和城乡建设部网站百度公司在哪里
  • 网站企业备案和个人备案的区别吗推广自己的网站
  • 做网站那个平台好百度平台营销
  • 深圳营销型网站制作公司营销的概念是什么
  • 做营销网站多少钱百度电话怎么转人工
  • 网络推广公司怎么找客户怎样优化标题关键词
  • 公司网站建设厂家怎么做一个自己的网站
  • 上海网站建设模板外贸公司一般怎么找客户
  • 网站建设登录结构图百度seo可能消失
  • h5网站开发语言选择商城全网推广运营公司
  • 高端网站建设询问磐石网络百度seo搜索
  • 建立门户网站的步骤软文营销网站
  • wordpress4.9怎么安装外贸谷歌seo
  • 网站联盟是什么网站备案查询官网