List接口常用实现类的特点和底层实现
List接口常用的实现类有3个:ArrayList、LinkedList、Vector。
那么它们的特点和底层实现有哪些呢?
ArrayList特点和底层实现
ArrayList底层是用数组实现的存储。
特点:查询效率高,增删效率低,线程不安全。我们一般使用它。
查看源码,我们可以看出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的源码,可以看到里面包含了双向链表的相关代码:
注:entry在英文中表示“进入、词条、条目”的意思。在计算机英语中一般表示“项、条目”的含义。
Vector向量
Vector底层用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。
【图3】Vector的源码(indexOf方法)
建议
如何选用ArrayList、LinkedList、Vector?
·线程安全时,用Vector。
· 局部变量不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)
·局部变量不存在线程安全问题时,增加或删除元素较多用LinkedList。
List接口常用实现类的特点和底层实现相关推荐
- JAVA集合Connection接口和Map接口常用的类及区别
JAVA集合详解 文章目录 JAVA集合详解 前言 一.集合是什么? 1. 集合类 2.集合和数组的区别: 二.使用步骤 一.Connection接口(单列集合) 1.List和Set的优缺点 2.总 ...
- P528 List接口常用实现类的对比及源码分析
- 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口
JDBC技术 JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口,JDBC是一种底层的API,因此访问数据库 ...
- Java中常用的类,包,接口
Java中常用的类,包,接口 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread等,不使用 ...
- Java集合框架之四大接口、常用实现类,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- java中常用的包 类和接口_java.util包常用的类和接口
标签:ash 可变 支持 set 组成 arraylist 层次结构 有序 结构 1. 常用接口 (1)Collection Collection 层次结构 中的根接口 ...
- Java汇集接口、异常处理、常用使用类和集合等技术的实验项目
一.实验目的 运用和掌握接口.异常处理.常用实用类和集合课程中的绝大部分技术 二.实验内容 1,创建一个水果接口,接口中定义水果被购买的行为,然后编写多个水果接口的实现类,例如Apple().Bana ...
- java常用的接口和类的说明,Java程序连接数据库的常用的类和接口介绍
编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中 ...
- JAVA基础初探(十二)Map接口及其常用实现类(HashMap)、File类详解(概述、创建、删除、重命名、文件属性读取/设置、遍历文件夹)
该篇博客目录 1.Map接口及其常用实现类(HashMap.Hashtable) 2.File类(概述.创建.删除.重命名.文件属性读取/设置.遍历文件夹) 一.Map接口及其常用实现类(HashMa ...
最新文章
- 关于AndroidSDK配置时的tools目录下找不到adb.exe的错误
- 网络层IP路由的负载均衡实现思路
- 在Itanium2、Intel Fortran Compiler上安装VASP4.6
- Java04异常、断言、日志和调试
- vue-cli@2的原理解析
- Linux执行命令提示Password,linux expect远程自动登录以及执行命令
- COCO 数据集格式及mmdetection中的转换方法
- Mybatis(17)注解方式增删改查单表
- phpcmsV9 表单向导(案例一)应用示例
- Linux基础知识题解答(四)
- 2个步骤,让人才成为组织进化的发动机
- 积分商城系统业务逻辑思维导图_怎么开发积分商城系统_OctShop
- linux最新bbr加速,CentOS 7.8 安装BBR加速
- Class not found: “xxx.xxx.xxx“报错
- 从0到1搭建大数据平台之调度系统
- vue中使用电子签名
- unity 获取两个向量夹角
- pku 2251 Dungeon Master 基本BFS
- java中的日历_Java中的日历功能
- js正则表达式过滤表情,输入法表情无法匹配,则反向判断
热门文章
- CF--思维练习--CodeForces - 221C-H - Little Elephant and Problem (思维)
- USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
- springmvc ztree 实现权限菜单的展示
- [零基础,全开源]基于web的远程深度学习服务搭建
- 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录
- linux-shell命令之chown(change owner)【更改拥有者】
- 【Android-NCNN-Vulkan】记录一次ncnn-vulkan在低性能开发板上出现的native内存溢出的问题
- 11 个重要的数据库设计规则
- 第十三章 时间序列分析和预测
- linux应用开发:日志记录