List接口(动态数组)
List接口(动态数组)
List集合类中元素有序且可重复
ArrayList(重要)
- 作为List接口的主要实现类
- 线程不安全的,效率高
- 底层使用Object[] elementData数组存储
ArrayList的源码分析
jdk7
- 构造器
ArrayList list = new ArrayList();
- 底层创建了长度为10的Object[]数组elementData
- 添加数据
list.add(123)
- 相当于elementData[0] = new Integer(123)
- 底层的数组长度为10,添加元素个数小于10时,正常添加元素
- 添加的元素个数大于10后(底层elementData数组容量不够),则需要扩容,默认扩容为原来容量的1.5倍(相当于新造一个数组,长度为原来长度的1.5倍)。同时需要将原来数组的数据复制到新的数组中
结论:建议使用带参的构造器(避免在中间时扩容)
ArrayList list = new ArrayList(int capacity)
jdk8
- 构造器
ArrayList list = new ArrayList();
- 底层Object[] elementData初始化为{},并没有创建长度为10的数组
- 添加数据
list.add(123)
- 第一次add()时,底层才创建了长度为10的数组,并将数据123添加到elementData[0]位置上
- 后续的添加与扩容操作与jdk7相同
结论
- jdk7中的ArrayList的对象的创建类似于单例模式中的饿汉式
- jdk8中的ArrayList的对象的创建类似于单例模式中的懒汉式。延迟了数组的创建,节省内存
LinkedList
- 对于频繁的插入、删除操作,使用此类效率比ArrayList高
- 底层使用双向链表存储

LinkedList的源码分析
LinkedList list = new LinkedList();
内部声明了Node类型的first和last属性,默认值为null
list.add(123);
将123封装到Node中,创建了Node对象
其中Node定义为(源码),体现了LinkedList双向链表的特征:
private static class Node<E> {
E item;
LinkedList.Node<E> next;
LinkedList.Node<E> prev;
Node(LinkedList.Node<E> prev, E element, LinkedList.Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
Vector(不常用)
- 作为List接口的古老实现类
- 线程安全的、效率低
- 底层使用Object[] elementData数组存储
Vector源码分析
- jdk7和jdk8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组
- 默认扩容为原来数组长度的2倍
三者异同
相同点
三个类都实现了List接口,存储数据的特点相同(有序、可重复的数据)
不同点
- 底层不同
- 不同情况下效率不同
- 线程安全问题
List接口中常用的方法
Collection中的方法都可用
add(int index , Object eles)
在index位置开始,将eles中的所有元素添加进来
ArrayList list = new ArrayList();
list.add(123);
list.add("Ann");
list.add(new Students("Tom",18,90));
list.add(987); list.add(3,"AA");
System.out.println(list);//[123, Ann, Students{name='Tom', age=18, grade=90.0}, AA, 987]
addAll(int index , Collection eles)
从index位置开始将eles中的所有元素添加进来
ArrayList list = new ArrayList();
list.add(123);
list.add("Ann");
list.add(new Students("Tom",18,90));
list.add(987); ArrayList arrayList = new ArrayList();
arrayList.add(123);
arrayList.add("Lisa"); list.addAll(arrayList);
System.out.println(list);//[123, Ann, Students{name='Tom', age=18, grade=90.0}, 987, 123, Lisa]
注意使用的是add()还是addAll():
- add()方法中将添加的元素看成一个整体,无论eles中有多少个元素,添加后的元素个数就是+1
- addAll()方法中eles中有多少个元素,添加后就多多少个元素
get(int index)
获取指定index位置的元素
System.out.println(list.get(1));//Ann
indexOf(Object obj)
返回obj在当前集合中首次出现的位置
System.out.println(list.indexOf(123));//0
- 若存在该元素,返回其第一次出现的位置
- 若不存在该元素,返回-1
lastIndexOf(Object obj)
返回obj在当前集合中最后一次出现的位置
System.out.println(list.lastIndexOf(123));//4
- 若存在该元素,返回其最后一次出现的位置
- 若不存在该元素,返回-1
remove(int index)
移除指定index位置元素,并返回此元素
System.out.println(list.remove(1));//Ann
System.out.println(list);//[123, Students{name='Tom', age=18, grade=90.0}, 987, 123, Lisa]
注意和Collection接口中的remove方法区分
set(int index , Object ele)
设置指定index位置的元素为ele
System.out.println(list);//[123, Students{name='Tom', age=18, grade=90.0}, 987, 123, Lisa]
list.set(2,789);
System.out.println(list);//[123, Students{name='Tom', age=18, grade=90.0}, 789, 123, Lisa]
subList(int fromIndex , int toIndex)
返回从fromIndex到toIndex位置的子集合(左闭右开)
System.out.println(list);//[123, Students{name='Tom', age=18, grade=90.0}, 789, 123, Lisa]
System.out.println(list.subList(1, 3));//[Students{name='Tom', age=18, grade=90.0}, 789]
总结
增:add(Object obj)
删:remove(int index)、remove(Object obj)
改:set(int index , Object obj)
查:get(int index)
插:add(int index , Object obj)
长度:size()
遍历
① Iterator迭代器方式
②增强for循环
③普通循环
注:区分remove方法(形参)
- List接口中remove方法要求里面的形参是int类型
- Collection接口中remove方法要求里面的形参是对象
- 若list中元素为1,2,3;remove(2)表明移除位置为2的元素;若想要移除元素2,需要remove(new Integer(2))
List接口(动态数组)的更多相关文章
- Delphi内存管理(Integer、Boolean、Record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、Variant、动态数组、接口也是由Delphi自动管理)
一.什么是堆.栈? 程序需要的内存空间分为 heap(堆) 和 stack(栈),heap 是自由存储区, stack 是自动存储区,使用 heap 需要手动申请.手动释放, stack 是自动申请. ...
- ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)
一.基本概念 ArrayList是一个可以添加对象元素,并进行元素的修改查询删除等操作的容器类.ArrayList底层是由数组实现的,所以和数组一样可以根据索引对容器对象所包含的元素进行快速随机的查询 ...
- C++语言------顺序表实现,用动态数组的方法
C++ 中常用的一些东西,通过使用动态数组来实现顺序表, 掌握了一下知识点: 1.预处理有三中方法 宏定义,文件包含,条件编译 2.使用同名的变量时,可以在外层使用命名空间 类解决变量名重定义的错误 ...
- C基础 万能动态数组
引言 - 动态数组切入 开发中动态类型无外乎list 或者 vector, 这里就是在C中实现vector结构容器部分. 对于C中使用的数据结构, 可以参照下面感觉很不错框架源码学习 , 感觉是< ...
- STL之顺序容器 deque 动态数组
deque是一个动态数组,deque与vector非常类似,vector是一个单向开口的连续线性空间,deque则是双向开口的连续线性空间.两者唯一的区别是deque可以在数组的开头和末尾插入和删除数 ...
- C和Fortran互相传递动态数组
C和Fortran的相互调用传递数值的方法有很多,但是F03标准的出笼,使用ISO_C_BINDING进行C和Fortran的互相调用有着更显著的优势: 1.与编译器和平台无关: 2.Fortran中 ...
- C++学习之动态数组类的封装
动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...
- 数据结构(1) 第一天 算法时间复杂度、线性表介绍、动态数组搭建(仿Vector)、单向链表搭建、企业链表思路
01 数据结构基本概念_大O表示法 无论n是多少都执行三个具体步骤 执行了12步 O(12)=>O(1) O(n) log 2 N = log c N / log c N (相当于两个对数进行了 ...
- 纯数据结构Java实现(1/11)(动态数组)
我怕说这部分内容太简单后,突然蹦出来一个大佬把我虐到哭,还是悠着点,踏实写 大致内容有: 增删改查,泛型支持,扩容支持,复杂度分析.(铺垫: Java语言中的数组) 基础铺垫 其实没啥好介绍的,顺序存 ...
随机推荐
- asp.net Core依赖注入(自带的IOC容器)
今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库. 在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码. 比如,在我们的 ...
- Java BigDecimal和double BigDecimal类
BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...
- SQL语句中where 1=1的意义
我们在看别人项目的时候,很多时候看到这样的SQL语句: select * from user where 1=1 其中这个where1=1是有特殊意义的,包含以下两种情境:动态SQL拼接和查询表结构. ...
- Nginx使用upstream实现负载均衡
如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用.具体配置过程如下: 1. 在http节点下,添加ups ...
- Python 实现短信轰炸机
原理其实很简单,就是利用selenium包打开各种网站的注册页,输入轰炸的号码,实现轰炸.其实也算是利用了注册漏洞.申明:仅娱乐使用,禁止️用于非法用途!若用于非法用途,后果及法律责任博主一律不承担 ...
- 线程的创建方式以及synchronize的使用
线程的两种创建方式 继承 Thread class Thr extends Thread { @Override public void run() { Thread.cur ...
- 精简CSS代码,提高代码的可读性和加载速度
前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ...
- CF1215D Ticket Game(思维,博弈)
题目 传送门:https://www.luogu.com.cn/problem/CF1215D Idea 一列数,保证能分成左右两部分,其中有若干个数字被抹掉,两个人轮流填数,如果在把这些空缺的数字填 ...
- Flask-Limit使用详细说明
Flask-Limit详细说明 在flask项目中我们需要对全部或者一部分接口进行限制,又不想造轮子,那怎么办呢? 所以这就是flask-limit出现的原因,不过对于相对复杂的需求,还是自己造轮子吧 ...
- 基于NeteaseCloudMusicApi和electron-vue开发网易云音乐--electron-vue初始化
本机环境: nodejs v12.16.3 npm 6.14. vue-cli 4.3. 初始化项目 vue init simulatedgreg/electron-vue my-project // ...