004-jdk-数据结构-ArrayList、LinkedList
一、ArrayList概述
数组集合,无容量限制,非线程安全
ArrayList、Vector是线性表,使用Object数组作为容器去存储数据的,添加了很多方法维护这个数组,使其容量可以动态增长,极大地提升了开发效率。它们明显的区别是ArrayList是非同步的,Vector是同步的。不用考虑多线程时应使用ArrayList来提升效率。
ArrayList的基层是数组,实现了通过index直接访问数据
最佳使用推荐
数据连续写入,需要根据index进行查找;写入和删除较少的,必须使用有参数的构造,即使超过了也会自动扩展。
1.1、JDK8 的ArrayList实现
1)重要的成员变量
private static final int DEFAULT_CAPACITY = 10;
默认初始化容量
transient Object[] elementData;
存储arraylist元素的数组缓冲区。arraylist的容量是这个数组缓冲区的长度。任何带有elementdata==defaultcapacity_empty_elementdata的空arraylist将在添加第一个元素时扩展为默认容量
private static final Object[] EMPTY_ELEMENTDATA = {};
用于空实例的共享空数组实例。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
共享空数组实例,用于默认大小的空实例。我们将其与空元素数据区分开来,以了解何时充气添加第一个元素。
2)构造方法
构造一、空参数构造,构造初始容量为10的空列表。
//构造初始容量为10的空列表。
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
创建一个空的共享数组实例,没有初始化的默认的10,默认的是在第一add时候创建的
构造二、初始容量构造。按照给点参数构造
//构造具有指定初始容量的空列表。
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
参看代码:initialCapacity 大于0 直接创建指定大小的数组;等于0 创建一个空元素的的共享数组;小于0 会抛出异常
注意:此处的初始容量initialCapacity,不会影响后续的自动扩展,只是降低添加时候的数据动态扩展以及拷贝,如果添加的数据大于initialCapacity,此时就会自动扩展数组了。
优化点,如果需要确定添加 20个元素,需要initialCapacity的设置为:20,这样就降低了动态扩展,以及数组的拷贝内存,时间的消耗
构造三、按照集合迭代器返回元素的顺序构造包含指定集合的元素的列表
//按照集合迭代器返回元素的顺序构造包含指定集合的元素的列表。
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
将集合创建成数据
3)常用方法说明
add(E e):元素末尾插入
先会执行:ensureCapacityInternal(size + 1); 确定增长因子以及初始化默认数组
分析:ensureCapacityInternal
1》当前长度加1,calculateCapacity(elementData, minCapacity) ,内部确定了最小容量minCapacity
2》调用 ensureExplicitCapacity,如果没有超出范围,什么都不做,超出范围,执行grow
3》查看grow
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
说明:java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
4》grow主要是,扩展1.5倍的容量,重新拷贝创建一个新数组
add(int index, E element)
大部分与上述一致,只是在确定增加mod后,System.arraycopy(elementData, index, elementData, index + 1,size - index);必须重建数组。
remove(Object o)
移除,如果找到,确定会重新拷贝数组,删除的元素直接抛弃,等待GC收集即可,与clear一致
其他方法,没有比较复杂的,不在复述
二、LInkedList
采用链表进行存储
基于双向列表的机制,插入创建一个Entry对象,并切换前后元素引用,非线程安全
相对于ArrayList,其优势:add,remove较快,因为只需要操作前后元素,而ArrayList需要操作整个列表; get,set较慢以为ArrayList是有序的,LinkedList需要整个遍历
LinkedList是基于双端链表的List,其内部的实现源于对链表的操作,所以适用于频繁增加、删除的情况;该类不是线程安全的;另外,由于LinkedList实现了Queue接口,所以LinkedList不止有队列的接口,还有栈的接口,可以使用LinkedList作为队列和栈的实现。
最佳使用推荐
频繁增加、删除的场景,遍历查找较少的
2.1、JDK1.8的LinkedList实现
没有具体特殊的。可自行参看
004-jdk-数据结构-ArrayList、LinkedList的更多相关文章
- ArrayList, LinkedList, Vector - dudu:史上最详解
ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...
- Java数据结构ArrayList
Java数据结构ArrayList /** * <html> * <body> * <P> Copyright JasonInternational</p&g ...
- arraylist linkedlist性能测试
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Ran ...
- ArrayList LinkedList Vector
ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...
- 09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHashSet,TreeSet
09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHas ...
- java面试题(杨晓峰)---第八讲谈谈Vector,ArrayList,LinkedList有何区别?
Vector,ArrayList,LinkedList均为线性的数据结构,但是从现实方式与应用场景中又存在差别. 1 底层实现方式 ArrayList内部数组来实现,LinkedList内部采用双向链 ...
- Java集合--ArrayList,LinkedList性能分析
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308900.html 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口 ...
- Java Collection - ArrayList & LinkedList
总结 ref: https://blog.csdn.net/qq_32679815/article/details/78907437 1-ArrayList是实现了基于动态数组的数据结构,Linked ...
- ArrayList,LinkedList,Vestor
Collection是最基本的集合接口,声明了适用于JAVA集合的通用方法,list和set都继承自collection接口. Collection接口的方法 boolean add(Object o ...
- 四种常见的数据结构、LinkedList、Set集合、Collection、Map总结
四种常见的数据结构: 1.堆栈结构: 先进后出的特点.(就像弹夹一样,先进去的在后进去的低下.) 2.队列结构: 先进先出的特点.(就像安检一样,先进去的先出来 ...
随机推荐
- 使用RevitNet操作多个版本的Revit
在Revit二次开发中,如果只是简单的从模型中提取数据或不需要界面对Revit进行修改,我们一般使用RevitNet. 如果对RevitNet不熟悉的,请参考:RevitAPI进阶之独立进程内读取.写 ...
- Linux学习笔记(十)shell基础:历史命令、命令补全、输出重定向、输出重定向
一.历史命令 history [选项] [历史命令保存文件] -c 清空历史命令 -w 吧缓存中的历史命令写入历史命令保存文件~/.bash_history中 系统会默认将上次注销登录(正确退出)之前 ...
- vSphere
VMware vSphere集成容器(VIC)建立了一个在轻量级虚拟机内部署并管理容器的环境.全新的虚拟机环境提供了更高级别的硬件隔离度,灵活性以及可扩展性使得容器对开发人员以及企业应用具有如此大的吸 ...
- linux 、 CentOs ---> 环境变量设置
Linux下环境变量设置 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错 ...
- curl命令的用法
curl 命令详解 命令事例 发送POST请求: 如果传输文件:curl -F "blob=@tmp.txt;type=text/plain" localhost:8080/r ...
- MFC消息路由
1.Command Routing(命令传递):当消息进来时,会有一个泵推动它前进.消息如何进来,以有泵函数如何推动,都是属于windows程序设计的范畴, 消息如果是从子类流向父类(纵向流动),那么 ...
- 1、概述&应用场景
1.概述&应用场景 Java反射机制是在运行状态中,对于任意一个类(Class)文件,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信 ...
- 20、自动装配-@Autowired&@Qualifier&@Primary
20.自动装配-@Autowired&@Qualifier&@Primary 自动装配:Spring 利用依赖注入(DI),完成对IOC容器中各个依赖关系赋值 20.1 @Autowi ...
- css 禁止点击事件触发
鼠标不可点击主要是两种表现: 1.鼠标不可点击时的显示状态 cursor: not-allowed 2.禁止触发点击事件 pointer-events:none
- 002_STM32程序移植之_DHT11
1. 测试环境:STM32C8T6 2. 测试模块:DHT11温湿度模块 3. 测试接口: 1. DHT11温湿度模块接口: DS1302引脚 ---------单片机引脚 VCC---------- ...