Java中Vector、ArrayList、LinkedList的关系详细解析

 更新时间:2023年11月16日 10:30:40   作者:进击的猫  
这篇文章主要介绍了Java中Vector、ArrayList、LinkedList的关系详细解析,Vector和ArrayList底层均为Object数组,LinkedList底层是Node节点,Vector是线程安全(底层方法均添加synchronized),ArrayList、LinkedList是线程不安全(无锁),需要的朋友可以参考下

(一)List实现类关系

Collection集合层级

List与Set关键点:

(1)Vector和ArrayList底层均为Object数组,LinkedList底层是Node节点。

(2)Vector是线程安全(底层方法均添加synchronized),ArrayList、LinkedList是线程不安全(无锁)。

(3)Vector默认值10,扩容机制为构造函数设置自动扩容大小或者默认翻倍;ArrayList默认值为10,扩容机制为1.5倍,采用旧数组大小+旧数组大小右移1位;LinkedList无扩容机制,原因为底层存储为Node节点。

(4)Vector无参构造函数直接使用默认值10进行初始化,ArrayList无参构造函数未初始化,第一次add的时候进行初始化。

(5)Vector可以指定每次扩容大小,ArrayList不能指定每次扩容大小,固定为1.5倍。

(二)List实现类的使用场景

(1)Vector是线程安全,因底层方法添加了synchronized,导致多线程会阻塞,性能较低;

(2)ArrayList用于大量查询和修改,因底层是数组,便于查询和修改值。(线程不安全,单线程)

(3)LinkedList用于添加和删除,因底层是链表,便于插入值和删除值。(线程不安全,单线程)

(三)List线程安全操作类

(1)Collections.synchronizedList方法是将底层操作均封装了并添加了synchronized;

(2)CopyOnWriteArrayList是采用ReentrantLock实现线程安全,读写分离,写时复制;

优缺点:

(1)Collections.synchronizedList(synchronized关键字实现)写数据性能上优于CopyOnWriterArrayList;

(2)CopyOnWriteArrayList(ReentrantLock实现读写分离,写时复制)在读性能上优于Collections.synchronizedList;

读写分离、写时复制原理:

 //写操作:add、remove、set等都是写操作,这里仅列举add方法
  public boolean add(E e) {
       final ReentrantLock lock = this.lock;
       lock.lock();//加锁
       try {
           Object[] elements = getArray();//获取原数组
           int len = elements.length;
           Object[] newElements = Arrays.copyOf(elements, len + 1);//将原数组复制到新数组
           newElements[len] = e;
           setArray(newElements);//将新数组重新赋值到原数组
           return true;
       } finally {
           lock.unlock();
       }
   }
 //读操作://因为读操作不影响数据,不需要加锁
   //根据索引查找
   public E get(int index) {
       return get(getArray(), index);//调用封装的get
   }
   private E get(Object[] a, int index) {
       return (E) a[index];//直接返回数据
   }

到此这篇关于Java中Vector、ArrayList、LinkedList的关系详细解析的文章就介绍到这了,更多相关Vector、ArrayList、LinkedList的关系内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • DTD验证xml格式的三种方式详解

    DTD验证xml格式的三种方式详解

    这篇文章主要介绍了DTD验证xml格式的三种方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • spring boot的maven配置依赖详解

    spring boot的maven配置依赖详解

    本篇文章主要介绍了spring boot的maven配置依赖详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 如何基于spring security实现在线用户统计

    如何基于spring security实现在线用户统计

    这篇文章主要介绍了如何基于spring security实现在线用户统计,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中String和StringBuffer及StringBuilder 有什么区别

    Java中String和StringBuffer及StringBuilder 有什么区别

    这篇文章主要介绍了Java中String和StringBuffer及StringBuilder 有什么区别,String 是 Java 语言非常基础和重要的类,更多相关内容需要的小伙伴可以参考下面文章内容
    2022-06-06
  • Java类型通配符应用实战分析

    Java类型通配符应用实战分析

    这篇文章主要介绍了Java类型通配符应用实战,简单分析了Java类型通配符概念、原理并结合实例形式给出了Java类型通配符相关使用技巧,需要的朋友可以参考下
    2019-07-07
  • 在SpringBoot中使用Logback管理记录日志

    在SpringBoot中使用Logback管理记录日志

    本篇文章主要介绍了在SpringBoot中使用Logback管理记录日志,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Redis使用RedisTemplate模板类的常用操作方式

    Redis使用RedisTemplate模板类的常用操作方式

    这篇文章主要介绍了Redis使用RedisTemplate模板类的常用操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot配置连接两个或多个数据库的实现

    SpringBoot配置连接两个或多个数据库的实现

    本文主要介绍了SpringBoot配置连接两个或多个数据库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java基础之super关键字浅析

    Java基础之super关键字浅析

    java中的super关键字是一个引用变量,用于引用直接父类对象,下面这篇文章主要给大家介绍了关于Java基础之super关键字的相关资料,需要的朋友可以参考下
    2022-04-04
  • java搭建一个Socket服务器响应多用户访问

    java搭建一个Socket服务器响应多用户访问

    本篇文章主要介绍了java搭建一个Socket服务器响应多用户访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论