LinkedList必懂知识点

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必懂知识点)