网站首页 > 精选教程 正文
唯有努力不懈,方能收获成功的果实,让梦想照进现实。
问题:为什么需要集合呢?
有了数据类型,那么想要存放多个数据呢,比如存放1000个String类型的数据,我们不可能手动写1000个变量存放吧?
一、存放到数组里
存放数组确实可以,但是数组在操作数据时不太方便,比如删除一个中间的数据,多次添加数据后,你声明的数组长度可能又不够了,你需要复制一下,进行扩容操作,如此操作的话,业务代码添加了一堆不需要的业务逻辑,影响代码的整洁性,这又引入了新的问题:
1、如何方便的删除部分数据,新增部分数据?
2、如何在长度不够时自动扩容呢?
3、如何快速找到自己想要的数据呢?
二、集合
集合就是处理上述问题的,集合工具,会自动扩容,我们不需要操心容量不够的问题,删减数据依旧是不需要我们操心的,我们可以更集中对业务的编码。
二、集合框架结构
主要三个类型的,分别是 List、Map、Set
List:接口规范
具体实现类有:
ArraryList: 底层实现原理为数组,支持动态扩容、快速访问、添加删除数据较慢
LinkedList: 底层实现原理为双向链表,访问慢,添加删除数据较快
Map: 键值对映射型集合、查找快
Set:存放不重复的数据集合
三、ArrayList源码
从源码中可以看到,存放数据用的是Object类型的数组,存放元素个数的记录用的int作为记录。
初始化时提供了多个构造函数,这里看两个即可,第一个是带了数字入参的,参数规定了存放数据的数组初始化的容量,第二个是空的构造函数。
添加和删减元素涉及的逻辑较多,这里看着只有三行代码,逻辑上很清晰:
1,判断存放数据的数组Object[] 容量是否够用,不够的话,进行扩容
2,添加数据
看一下ensureCapacityInternal(int minCapacity) 方法
这里的最终是调用了扩容方法 grow()
我们看到所谓的扩容,就是将原有的数组复制到一个新的,容量大的数组上。Arrays.copy就是这么流程。对应的删除数据,就会涉及缩减容量,以及元素移动填充到被删减的位置。
四、面试点
1.ArrayList和LinkedList 有哪些区别
关键点,实现结构不一样,ArraryList是数组实现,这就决定了查找数据方便,添加删减数据可能会耗时较久,影响性能,LinkedList 是双向链表,添加数据,删除数据很快,但是查找数据必须得从头开始,所以查询数据会慢。
2.集合初始化问题
有的会让你详细的讲解初始化流程,会问到扩容的大小等具体细节
3.线程安全问题
线程安全暂时不放到这块,会在多线程模块说明
- 上一篇: 工业大数据平台技术架构方案(ppt)
- 下一篇: 深入 Spring 框架:从核心到高级特性
猜你喜欢
- 2024-12-23 应用Stream API与并行流处理大数据量集合操作
- 2024-12-23 字节二面:为什么SpringBoot的 jar可以直接运行?
- 2024-12-23 阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战
- 2024-12-23 深入 Spring 框架:从核心到高级特性
- 2024-12-23 工业大数据平台技术架构方案(ppt)
- 2024-12-23 大数据整体架构技术方案(ppt)
- 2024-12-23 如何用20%技术解决80%问题?这份Java进阶架构师手册,告诉你答案
- 2024-12-23 深入探索 Java 复杂泛型:使用与限制全解析
- 2024-12-23 大学大数据平台架构规划方案(ppt)
- 2024-12-23 Java中如何实现两个线程之间的数据共享?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)