专业的JAVA编程教程与资源

网站首页 > java教程 正文

重学java:数据集合

temp10 2024-12-05 16:42:27 java教程 16 ℃ 0 评论

唯有努力不懈,方能收获成功的果实,让梦想照进现实。


重学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.线程安全问题

线程安全暂时不放到这块,会在多线程模块说明

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表