List接口常用的实现类有3个:ArrayList、LinkedList、Vector。

那么它们的特点和底层实现有哪些呢?

ArrayList特点和底层实现

ArrayList底层是用数组实现的存储。

特点:查询效率高,增删效率低,线程不安全。我们一般使用它。

图1

查看源码,我们可以看出ArrayList底层使用Object数组来存储元素数据。所有的方法,都围绕这个核心的Object数组来开展。

ArrayList是可以存放任意数量的对象,数组长度是有限的,那么是怎么实现的呢?

本质上就是通过定义新的更大的数组,将旧数组内容拷贝到新数组,来实现扩容。

ArrayList的Object数组初始化长度为10,如果我们存储满了这个数组,需要存储第11个对象,就会定义新的数组长度长度更大的数组,并将将原数组内容和新的元素一起加入到新数组中,源码中代码如下:

public void   ensureCapacity(int   minCapacity) {

modCount++;

int   oldCapacity = elementData.length;

if   (minCapacity > oldCapacity) {

Object oldData[] =   elementData;

int   newCapacity = (oldCapacity * 3)/2 + 1;

if   (newCapacity < minCapacity)

newCapacity = minCapacity;

//   minCapacity is usually close to size, so this is a win:

elementData =   Arrays.copyOf(elementData, newCapacity);

}

}

LinkedList特点和底层实现

LinkedList底层用双向链表实现的存储。

特点:查询效率低,增删效率高,线程不安全。

双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。

每个节点都应该有3部分内容:

class  Node {

Node  previous;   //前一个节点

Object  element;    //本节点保存的数据

Node  next;       //后一个节点

}

我们查看LinkedList的源码,可以看到里面包含了双向链表的相关代码:

图2

注:entry在英文中表示“进入、词条、条目”的意思。在计算机英语中一般表示“项、条目”的含义。

Vector向量

Vector底层用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。

【图3】Vector的源码(indexOf方法)

建议

如何选用ArrayList、LinkedList、Vector?

·线程安全时,用Vector。

· 局部变量不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)

·局部变量不存在线程安全问题时,增加或删除元素较多用LinkedList。

List接口常用实现类的特点和底层实现相关推荐

  1. JAVA集合Connection接口和Map接口常用的类及区别

    JAVA集合详解 文章目录 JAVA集合详解 前言 一.集合是什么? 1. 集合类 2.集合和数组的区别: 二.使用步骤 一.Connection接口(单列集合) 1.List和Set的优缺点 2.总 ...

  2. P528 List接口常用实现类的对比及源码分析

  3. 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口

    JDBC技术 JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口,JDBC是一种底层的API,因此访问数据库 ...

  4. Java中常用的类,包,接口

    Java中常用的类,包,接口 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread等,不使用 ...

  5. Java集合框架之四大接口、常用实现类,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  6. java中常用的包 类和接口_java.util包常用的类和接口

    标签:ash   可变   支持   set   组成   arraylist   层次结构   有序   结构 1. 常用接口 (1)Collection Collection 层次结构 中的根接口 ...

  7. Java汇集接口、异常处理、常用使用类和集合等技术的实验项目

    一.实验目的 运用和掌握接口.异常处理.常用实用类和集合课程中的绝大部分技术 二.实验内容 1,创建一个水果接口,接口中定义水果被购买的行为,然后编写多个水果接口的实现类,例如Apple().Bana ...

  8. java常用的接口和类的说明,Java程序连接数据库的常用的类和接口介绍

    编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中 ...

  9. JAVA基础初探(十二)Map接口及其常用实现类(HashMap)、File类详解(概述、创建、删除、重命名、文件属性读取/设置、遍历文件夹)

    该篇博客目录 1.Map接口及其常用实现类(HashMap.Hashtable) 2.File类(概述.创建.删除.重命名.文件属性读取/设置.遍历文件夹) 一.Map接口及其常用实现类(HashMa ...

最新文章

  1. 关于AndroidSDK配置时的tools目录下找不到adb.exe的错误
  2. 网络层IP路由的负载均衡实现思路
  3. 在Itanium2、Intel Fortran Compiler上安装VASP4.6
  4. Java04异常、断言、日志和调试
  5. vue-cli@2的原理解析
  6. Linux执行命令提示Password,linux expect远程自动登录以及执行命令
  7. COCO 数据集格式及mmdetection中的转换方法
  8. Mybatis(17)注解方式增删改查单表
  9. phpcmsV9 表单向导(案例一)应用示例
  10. Linux基础知识题解答(四)
  11. 2个步骤,让人才成为组织进化的发动机
  12. 积分商城系统业务逻辑思维导图_怎么开发积分商城系统_OctShop
  13. linux最新bbr加速,CentOS 7.8 安装BBR加速
  14. Class not found: “xxx.xxx.xxx“报错
  15. 从0到1搭建大数据平台之调度系统
  16. vue中使用电子签名
  17. unity 获取两个向量夹角
  18. pku 2251 Dungeon Master 基本BFS
  19. java中的日历_Java中的日历功能
  20. js正则表达式过滤表情,输入法表情无法匹配,则反向判断

热门文章

  1. CF--思维练习--CodeForces - 221C-H - Little Elephant and Problem (思维)
  2. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
  3. springmvc ztree 实现权限菜单的展示
  4. [零基础,全开源]基于web的远程深度学习服务搭建
  5. 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录
  6. linux-shell命令之chown(change owner)【更改拥有者】
  7. 【Android-NCNN-Vulkan】记录一次ncnn-vulkan在低性能开发板上出现的native内存溢出的问题
  8. 11 个重要的数据库设计规则
  9. 第十三章 时间序列分析和预测
  10. linux应用开发:日志记录