一.ArrayList:

  底层为数组实现,线程不安全,查询,修改快,增加删除慢,

数据结构:数组以0为下标依次连续进行存储

  数组查询元素:根据下标查询就行

  数组增加元素:如果需要给index为10的位置添加,则从index为11的位置开始右移

数组删除元素:如果需要删除index为10的位置,则从index为11的位置开始左移

线程: 如果判断线程安不安全只需要了解到是否进行加锁,如果没有加锁的话,多个线程操作同一个对象时就会出现线程不安全的情况.

源码:

1.new一个arraylist,调用add方法

2.查看add方法的源码可以看出,并没有任何加锁操作,这就是线程不安全的 ,这里首先会确认数组的容量,对其进行增加,并将新的元素加入到数组中

使用场景:查询 修改多

二.LikedList:

  底层为链表实现,线程不安全,查询修改慢,增加删除快

数据结构:链表的每个元素都存储了下一个元素的地址,从而使一系列的随机的内存地址串在了一起,只要有足够的内存空间,就可以为链表分配内存

  链表查:当同时读取所有元素时,链表的效率很高,读第一个,读第二个,以此类推。如果需要找到某个节点时,就需要遍历整个节点,才可以找到需要的元素

  链表增加元素:只需要修改它前面的那个元素指针指向的地址即可

  链表删除元素:只需要将前一个元素指针指向的地址更改即可

线程: 如果判断线程安不安全只需要了解到是否进行加锁,如果没有加锁的话,多个线程操作同一个对象时就会出现线程不安全的情况.

源码:

1.new一个likedlist

2.可以看到likedlist源码中也无任何的加锁操作,其中add又调用了linklast

3.linklast里会吧新加元素设置为尾节点,所以创建了一个新的Node(节点)存起来,然后再新建一个节点,把之前的node指向链表的最后一个节点,然后再判断一下l是否为空也就是之前的链表里是否为空,如果为空则吧新的节点设为头节点,否则就把next改为newnode,同时size和modcound自增

同样的 也没看到任何加锁的操作

使用场景:增加删除多

三,Vector

  底层是数组实现,线程安全的,操作的时候使用synchronized进行加锁

  因为是数组实现的,curd方面可以参考arraylist,由于是加锁的,所以比前两个list效率更低的

源码

1.new一个Vector,

  

2. 可以看到这个方法使用了 synchronized来进行修饰,对此方法进行加锁,因此这个方法对元素操作时是效率安全的,但效率相对较低,

同样的首先确认元素,扩容+1,把新的元素放进去

  

题外话.怎样来保证list的线程安全

  方式一:自己写一个包装类,根据业务,一般在进行add/update/remove操作时加锁

  方式二:collections调用 synchronizedlist方法,

源码:

1.创建一个list,会返回一个线程安全的list给你

  

2.可看到这个方法里首先是一个list集合,mutex是一个加锁的对象

  

3.在继续打开synchronizedrandomaccesslist

  

4,打开super,这里可以看到这里返回了一个同步的synchronizedlist,同样也继承了一个list方法

  

5.在synchronizedlist里可以找到常用的一些方法,同样也是加锁的,所以这个就变成线程安全了

  

  方式三:CopyOnWriteArrayList

源码:

1.new CopyOnWriteArrayList   使用ReentrantLock加锁

  

2. CopyOnWriteArrayList 在使用get操作时没有加锁的 这个与synchronizedlist对比来说性能要更好一点

  

3,在add方法时可以看到用了ReentrantLock来进行加锁,再用object数组获取老的数组,并将老的数组获取保存在len,

下面再用Arrays.copyof进行拷贝,将老的数组拷贝到新的数组newElements,并将长度+1,+1的原因就是为了存放新的元素,

目前内存里有两个空间,一个空间是新的空间,另一个是旧的空间

  

  

setarray是为了将新的拷贝到旧的里,也就是改变了他的引用地址

最终unlock,把锁释放

  

  

  

  

java面试基础篇-List的更多相关文章

  1. java面试基础篇(一)

    最近想深入的理解一下java 的工作机制,也是便于后期的面试. 1.A:HashMap和Hashtable有什么区别? Q:HashMap和Hashtable都实现了Map接口,因此很多特性非常相似. ...

  2. java面试基础篇(三)

    1.Q:ArrayList 和 LinkedList 有什么区别? A:ArrayList查询快!LinkedList增删快.ArrayList是基于索引的数据接口,它的底层是数组.空间占用相对小一些 ...

  3. java面试基础篇(二)

    上一篇,我们说了一下线程和Map,或许那些太抽象,不太好理解,也不太方便记忆,我们这次说一些简单的. 1.Q:java的基本数据类型有哪些? A:四种整数类型(byte.short.int.long) ...

  4. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  5. java 线程基础篇,看这一篇就够了。

    前言: Java三大基础框架:集合,线程,io基本是开发必用,面试必问的核心内容,今天我们讲讲线程. 想要把线程理解透彻,这需要具备很多方面的知识和经验,本篇主要是关于线程基础包括线程状态和常用方法. ...

  6. JAVA面试基础

    JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...

  7. JDBC-使用Java连接数据库-基础篇

    这是小主第一次写Java连接数据库博客,初学Java之时,Java连接数据库是我最头疼的,不过经过一个月的学习,也差不多略有收获,所以给大家分享一下. Java连接数据库大约需要五大步骤: 创建数据库 ...

  8. Java 笔试面试 基础篇 一

    1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...

  9. Java面试基础 -- Linux篇

    0.日常命令 cd 目录路径: 跳转到指定目录 mkdir 目录名称:新增目录 pwd: 获取当前路径 su: 切换用户 ll: 查看当前目录侠的文件和目录 rm -rf 目录: 递归删除指定目录下的 ...

随机推荐

  1. Python爬虫开发教程

     正文   现在Python语言大火,在网络爬虫.人工智能.大数据等领域都有很好的应用.今天我向大家介绍一下Python爬虫的一些知识和常用类库的用法,希望能对大家有所帮助.其实爬虫这个概念很简单,基 ...

  2. 基于JS正则实现模板数据动态渲染

    最近业务上需要动态渲染模板数据: 一.业务需求: 1.前端后端定义好模板以及变量名,根据打印机类型转换成对应sdk需要的标签模板,保存数据库 2.订单数据是前端根据支付结果获取的,最终渲染完的数据模板 ...

  3. 【30分钟学完】canvas动画|游戏基础(4):边界与碰撞

    前言 本系列前几篇中常出现物体跑到画布外的情况,本篇就是为了解决这个问题. 阅读本篇前请先打好前面的基础. 本人能力有限,欢迎牛人共同讨论,批评指正. 越界检测 假定物体是个圆形,如图其圆心坐标即是物 ...

  4. 简单易懂的Servlet路径问题

    关于servlet路径,我看了一下网上别人的博客园,发现都有一个通病,讲的太专业了,又抓不住关键部分,往往看一眼就不想看第二眼.所以我特地准备了初学者所通识的servlet路径问题. 1.标识符 /j ...

  5. 使用ZXingObjC扫描二维码横竖屏对应

    /** 根据屏幕的方向设置扫描的方向 * @author maguang * @param parameter * @return result */ - (void)showaCapture { C ...

  6. SpringBoot入门系列(五)Thymeleaf的常用标签和用法

    前面介绍了Spring Boot 中的整合Thymeleaf .不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/16577 ...

  7. php实现post跳转

    大家否知道php可以利用header('Location')实现get请求跳转. php利用curl可以实现模拟post请求. 但是却找不到php现成的实现post跳转.那么问题来了,如果有这个需求该 ...

  8. Netty源码分析之ChannelPipeline—出站事件的传播

    上篇文章中我们梳理了ChannelPipeline中入站事件的传播,这篇文章中我们看下出站事件的传播,也就是ChannelOutboundHandler接口的实现. 1.出站事件的传播示例 我们对上篇 ...

  9. 028.核心组件-API Server

    一 Kubernetes API Server原理 1.1 API Server功能 Kubernetes API Server的核心功能是提供Kubernetes各类资源对象(如Pod.RC.Ser ...

  10. .net webapi 接收保存图片到服务器,并居中剪裁压缩图片

    原文链接:https:////www.cnblogs.com/Jackyye/p/12510943.html 每天解决一些c#小问题,在写微信小程序,或者一些手机软件接口,我们经常要用到上传图片到服务 ...