美文网首页
LinkedList必懂知识点

LinkedList必懂知识点

作者: earl哦哦哦 | 来源:发表于2018-07-16 17:44 被阅读0次

Linkedlist 概述

linkedlist结构图

Linkedlist集合 底层试下你的数据结构是双向链表(hashmap中的链表结构是单向链表),linkedlist集合中允许元素为null(arrayList中也允许元素为空,但是hashmap中只允许有一个元素为空,并且一定存放在第一个桶内),Likedlist由于实现了List接口,所以其是允许存入重复的元素的,但是set集合就不允许元素重复。LinkedList不是线程安全的,ArrayList也不是线程安全的,hashmap也不是线程安全的。既然聊到了线程不安全的问题,那就聊一下copyonwrite思想吧。



Copyonwrite

写入时复制(CopyOnWrite)思想

写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者(Callers)同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此做法主要的优点是如果调用者没有修改资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。

(通俗点就是读的时候没有变化,改的时候负责原来的数据,然后再副本里面修改,再将原数据指向副本中去)



copyonwriteArrayList中读写分离原理

我们可以看到,在set方法中,我们首先是获得了当前数组的一个拷贝获得一个新的数组,然后在这个新的数组上完成我们想要的操作。当操作完成之后,再把原有数组的引用指向新的数组。并且在此过程中,我们只拥有一个事实不可变对象,即容器中的array。这样一来就很巧妙地体现了CopyOnWrite思想。其实这也是读写分离的一种体现。当线程在对线程进行读或者写的操作时,其实操作的是不同的容器。这么一来我们可以对容器进行并发的读,而不需要加锁。

(证明了在读的时候不需要加锁,但是在写的时候是有锁的,重入锁)


重入锁

LinkedList 双向链表实现及成员变量

成员变量

LinkedList中为什么要有first,last呢?其实就是双向链表的首尾结点。然后我们知道链表的查询速度较慢,但是引入了尾结点的话,我们可以根据index的大小进行二分查找。size记录着其中的元素总数。


LinkedList作为stack,queue使用

由于linkedlist实现了queue接口,所以他可以作为队列来使用,队列使用的是先进先出原则,所以我们可以看到linkedlist中有比如offer,add等等的接口,但是呢offer接口插入时,如果已经满了不会报错,只会返回fase。但是add会报错,我们实现队列这种接口的时候也要按照约定,返回fasle,而不是直接报错,类似的还有remove和poll等等。



ArrayList和LinkedList区别

  1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;

   2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;

(数组的存储是内存连续的,然而链表的并不是连续的)

    3. 对于添加和删除操作add和remove,一般大家都会说LinkedList要比ArrayList快,因为ArrayList要移动数据。但是实际情况并非这样,对于添加或删除,LinkedList和ArrayList并不能明确说明谁快谁慢,下面会详细分析。

从源码可以看出,ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,比如index < size / 2,则从左边开始查找,反之从右边开始查找,但是还是比ArrayList要慢。这点是毋庸置疑的。ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素;LinkedList主耗时的是要先通过for循环找到index,然后直接插入或删除。

     当数据量较小时,测试程序中,大约小于30的时候,两者效率差不多,没有显著区别;当数据量较大时,大约在容量的1/10处开始,LinkedList的效率就开始没有ArrayList效率高了,特别到一半以及后半的位置插入时,LinkedList效率明显要低于ArrayList,而且数据量越大,越明显。

相关文章

  • LinkedList必懂知识点

    Linkedlist 概述 Linkedlist集合 底层试下你的数据结构是双向链表(hashmap中的链表结构是...

  • ArrayList 和 LinkedList 哪个更占空间?

    今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的...

  • Hashmap必懂知识点

    HashMap浅谈 HashMap作为集合框架的重点,面试常常被提到。但是,如果仅仅是记住定论的你,往往会最后很痛...

  • ArrayList必懂知识点

    ArrayList 概述 自己的理解,数据结构的出现必定是伴随的原有的数据结构进行升级而出现的。为什么会有arra...

  • volatile必懂知识点

    摘要: 本来打算写一篇concurrentHashmap的文章,但是其中又因为它是线程安全的,所以又要先复习下vo...

  • Java基础面试知识点

    Java基础面试知识点 一.容器(HashMap、HashSet、LinkedList、ArrayList、数组等...

  • Java 集合系列(三)—— LinkedList

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 LinkedList    LinkedList是一种可...

  • SQL 优化必懂知识点

    1. 基数 单个列唯一键(distict_keys)的数量叫做基数。比如性别列,该列只有男女之分,抛开中性,所以这...

  • SQL 优化必懂知识点

    文章来源于作者:martin在 GitChat 上的分享。 1. 基数 单个列唯一键(distict_keys)的...

  • 趣步,必懂知识点

    《玩趣步必懂11个知识点》 一机一号 一个人终身注册一次,一机一号,注册账号和支付宝统一,人脸同一人。换手机登录,...

网友评论

      本文标题:LinkedList必懂知识点

      本文链接:https://www.haomeiwen.com/subject/sqebpftx.html