此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

1、ArrayList

  • 非线程安全

  • 基于对象数组

  • get(int index)不需要遍历数组,速度快;

  • iterator()方法中调用了get(int index),所以速度也快

  • set(int index, E e)不需要遍历数组,速度快

  • add方法需要考虑扩容与数组复制问题,速度慢

  • remove(Object o)需要遍历数组,并复制数组元素,速度慢

  • remove(int index)不需要遍历数组,需要复制数组元素,但不常用

  • contain(E)需要遍历数组

2、LinkedList

  • 非线程安全

  • 基于环形双向链表

  • get(int index)需要遍历链表,速度慢;

  • iterator()方法中调用了get(int index),所以速度也慢

  • set(int index, E e)方法中调用了get(int index),所以速度也慢

  • add方法不需要考虑扩容与数组复制问题,只需创建新对象,再将新对象的前后节点的指针指向重新分配一下就好,速度快

  • remove(Object o)需要遍历链表,但不需要复制元素,只需将所要删除的对象的前后节点的指针指向重新分配一下以及将所要删除的对象的三个属性置空即可,速度快

  • remove(int index)需要遍历链表,但不需要复制元素,只需将所要删除的对象的前后节点的指针指向重新分配一下以及将所要删除的对象的三个属性置空即可,但不常用

  • contain(E)需要遍历链表

3、Vector(线程安全的ArrayList)

  • 线程安全

  • 扩容机制与ArrayList不同

4、Stack(继承于Vector)

  • 线程安全

  • 效率低下,可采用双端队列Deque或LinkedList来实现,Deque用的较多

总结:

  • 在查询(get)、遍历(iterator)、修改(set)使用的比较多的情况下,用ArrayList

  • 在增加(add)、删除(remove)使用比较多的情况下,用LinkedList

  • 在需要线程安全而且对效率要求比较低的情况下,使用Vector,当然,实现ArrayList线程安全的方法也有很多,以后再说

  • 在需要使用栈结构的情况下,使用Deque,Stack废弃就行了

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 从golang的垃圾回收说起(下篇)

四种List实现类的对比总结的更多相关文章

  1. 第四章 四种List实现类的对比总结

    1.ArrayList 非线程安全 基于对象数组 get(int index)不需要遍历数组,速度快: iterator()方法中调用了get(int index),所以速度也快 set(int in ...

  2. java中的四种监听类用法

    在此列举四种方法: 自身类实现ActionListener接口,作为事件监听器 通过匿名类处理 通过内部类处理 通过外部类处理 下面依次介绍: 第一种:自身类实现ActionListener接口,作为 ...

  3. Java WebService _CXF、Xfire、AXIS2、AXIS1_四种发布方式(优缺点对比)

    xis,axis2,Xfire以及cxf对比 http://ws.apache.org/axis/ http://axis.apache.org/axis2/java/core/ http://xfi ...

  4. Apache Flink on K8s:四种运行模式,我该选择哪种?

    1. 前言 Apache Flink 是一个分布式流处理引擎,它提供了丰富且易用的API来处理有状态的流处理应用,并且在支持容错的前提下,高效.大规模的运行此类应用.通过支持事件时间(event-ti ...

  5. ThinkPHP中连接mysql数据库的四种实用和通用的连接方法

    ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库适配器来处理.目前的数 ...

  6. java多线程四种实现模板

    假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程? 这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快... 这里把模板放在这里,需要用的时候寻找合适的来选用. 总体分为两 ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第6节 权限修饰符_6_四种权限修饰符

    四种权限修饰符.从大到小 纵向再分成四种情况 同一个类 同一个类里面.private方式,可以访问到本类里面的 num成员变量 前面不写修饰符也能访问到 (default)就是不写的这种情况 受保护的 ...

  8. java自带的四种线程池

    java预定义的哪四种线程池? newSingleThreadExexcutor:单线程数的线程池(核心线程数=最大线程数=1) newFixedThreadPool:固定线程数的线程池(核心线程数= ...

  9. 横向对比分析Python解析XML的四种方式

    横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...

随机推荐

  1. 跟我学Spring Boot(三)Spring Boot 的web开发

    1.Web开发中至关重要的一部分,Web开发的核心内容主要包括内嵌Servlet容器和SpringMVC spring boot  提供了spring-boot-starter-web 为web开发提 ...

  2. 非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同

    非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同 1.非接触式IC卡的国际规范ISO/IEC14443的由来? 在非接触式IC卡的发展过程中,这些问题逐渐被解决并形 ...

  3. 在RedHat 和 Ubuntu 中配置 Delphi 的Linux开发环境(转)

    原文地址:http://chapmanworld.com/2016/12/29/configure-delphi-and-redhat-or-ubuntu-for-linux-development/ ...

  4. mysql 初始密码、修改密码

    新装MySQL,进不去,找不到网上说的什么临时密码,也没有见到放临时密码的文件,历经坎坷,终解决,,在此记录,谨防下次忘记,在此感谢原作者博文 系统 Ubuntu18.04 mysql Ver 14. ...

  5. TCP/IP协议(7):应用层

    应用层上协议有DNS.DHCP.HTTP.SSL/TLS.FTP.Telnet等. 1.DNS域名解析 DNS服务器用来解析域名从而获得对应IP地址,我们在对网络进行设置的时候如果DNS服务器没有设置 ...

  6. .Net 导出Excel时设置单元格的格式为文本类型

    <td style= 'vnd.ms-excel.numberformat:@ ' align='right'>" & Format(Val(rowTitle.Item( ...

  7. Typecho 调用分类文章列表

    其中pageSize后面的数字表示调用文章的数量:mid后面的数字表示调用的分类ID; 提示:Typecho分类目录ID的获取方法是把鼠标移到某分类名称上面,在浏览器状态栏显示的mid=后面的数字便是 ...

  8. servlet 解决乱码问题

    对于servlet大家应该都很熟悉了,今天再复习一下,如果有哪里写的不好或不对的地点希望广大的网友批评指正.今天只讨论get和post两w种方式,他们之间有很多的不同点,所以解决编码的方式也会不一样, ...

  9. [待完善]mycat使用(一)

    生产上的mycat已经投入使用,这次的应用场景是数据写入和查询都非常大的一个需求,而且经常出现多表join的查询 1.应用上线没多久出现大量慢查询: 分片键的选择率非常高,但没有建索引,在其上加上索引 ...

  10. crontab和crond分析

    目录 目录 1 1. 研究目的 1 2. 基本概念 1 3. crontab 1 3.1. 编辑 2 3.1.1. "crontab -e"工作流 2 3.2. 问题 3 4. c ...