admin 管理员组

文章数量: 887629


2024年1月17日发(作者:shell脚本学习指南pdf)

java集合类底层实现原理

Java集合类是Java中常用的一种数据结构,它可以容纳同类数据的对象,并对这些对象进行增、删、改、查等操作。Java提供了丰富的集合类,包括List、Set、Map等。它们底层的实现原理各不相同,但都有着自己的优势和适用范围,开发者可以根据实际需要进行选择。

一、List

List是Java中最常用的一种集合类,它是一个有序集合,可以容纳重复元素。List底层的实现原理有两种,一种是数组实现,另一种是链表实现。

1. 数组实现

在数组实现中,List集合底层使用的是数组的方式存储数据,使用了动态扩容技术,可以随数据量的增加而扩大数组的大小,并且支持快速随机访问。

当我们向数组中添加元素时,List会首先检查数组是否已满,如果已满,则会重新创建一个更大的数组,将原数组中的数据复制到新数组中,并将新的元素添加到新的数组中。在新增元素时,需要保持元素在原数组中的顺序,因此需要对数组中的元素进行移动和复制操作。

优点:

数组实现的List集合支持快速随机访问,因为数组是连续的内存空间,所以可以通过数组下标直接访问,性能比较高。

需要动态扩容,在添加元素时可能会引起数组重构,比较耗时。

当数组中存在大量空元素时,会占用过多的内存空间。

2. 链表实现

在链表实现中,List集合底层使用的是链表的方式存储数据,添加和删除元素的效率比数组实现高,但是在访问元素时需要遍历整个链表。

当我们向链表中添加元素时,List会创建一个新的Node对象,并将新的对象添加到链表的末尾。

链表实现的List集合添加和删除元素的效率比较高,因为只需要改变链表中的指针指向即可。

当需要对集合进行频繁的增删操作时,链表实现的List集合更加适合。

在访问元素时需要遍历整个链表,效率比较低。

二、Set

1. 基于HashMap实现

在基于HashMap实现的Set集合中,Set底层使用一个HashMap来存储元素,Set中的元素作为HashMap中的key,所有的value都是一个固定的Object对象(称为PRESENT)。

在向Set中添加元素时,先将元素作为key存入HashMap中,如果key已经存在则不做任何操作,如果不存在则将key存入HashMap,并将对应的value设置为PRESENT。

基于HashMap实现的Set集合中元素的添加、查询和删除都比较快。

三、Map

在基于数组实现的Map集合中,Map底层使用一个数组来存储元素,数组中每个元素都是一个Entry对象,Entry对象中包含一个key和一个value。

当我们向Map中添加元素时,Map会计算出key在数组中的下标,并将Entry对象存放在相应的位置上。如果数组中已存在具有相同key的元素,则会用新的value替换掉原来的value。

当数组中的元素个数到达一定阈值时,Map会进行扩容,重新创建一个更大的数组,并将原数组中的元素复制到新数组中。

基于数组实现的Map集合执行查找操作的速度比较快,因为可以通过数组下标直接访问。

需要动态扩容,并且扩容会导致元素复制的开销。

基于链表实现的Map集合插入元素的速度比较快。

当链表中的元素个数较小时,查询操作的效率比较高。

四、总结

Java集合类的底层实现原理各不相同,每种实现方式都有自己的优势和劣势。开发者在选择集合类时,应该根据实际场景进行选择,以提高程序的性能和效率。


本文标签: 数组 元素 集合 实现 链表