网站首页 > java教程 正文
唯有努力不懈,方能收获成功的果实,让梦想照进现实。
问题:为什么需要集合呢?
有了数据类型,那么想要存放多个数据呢,比如存放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.线程安全问题
线程安全暂时不放到这块,会在多线程模块说明
- 上一篇: 学习笔记之C#基础——数组和集合
- 下一篇: Java 集合 API 的改进
猜你喜欢
- 2024-12-05 Java 集合 API 的改进
- 2024-12-05 学习笔记之C#基础——数组和集合
- 2024-12-05 美团一面:如何高效地将两个有序的数组合并成一个有序数组
- 2024-12-05 Arrays.asList() 数组转换成集合酿成的线上事故
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)