ArrayList及HashMap的扩容规则讲解

yizhihongxing

1. ArrayList的扩容规则

ArrayList 是 Java 自带的动态数组容器,支持自动扩容。当在 arrayList 中添加元素时,如果当前的数组容量已满,则需要进行扩容。ArrayList 的默认初始容量是 10,扩容因子是 1.5 倍。也就是说,在当前容量满载时,会将容量扩大到 1.5 倍。

下面是 ArrayList 的扩容规则:

  • 当添加元素时,如果元素数量等于容量,就会发生扩容,将容量扩大为当前容量的 1.5 倍;
  • 如果当前容量不足以存储所有元素,则创建一个新的数组,并将原数组中的元素移动到新数组中;
  • 新数组的容量将是原数组容量的 1.5 倍,或者是当前元素数量(即最小容量)的两者中较大的那个。

示例一:当 ArrayList 中的元素数量达到容量时发生扩容

List<Integer> list = new ArrayList<>(10); // 默认容量为10
for(int i=0;i<=10;i++) {
    list.add(i);
}

当添加第 11 个元素后,ArrayList 会扩容,将容量变为 10 的 1.5 倍,即 15。此时 list 的容量为 15。

示例二:当元素数量高于容量最小值时,扩容为元素数量的两者中较大的那个

List<Integer> list = new ArrayList<>(3); // 自定义初始容量为3
// 添加5个元素到ArrayList中
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);

在这个示例中,ArrayList 的初始容量为 3,但是添加 5 个元素后,它的容量不足以容纳所有元素,因此会扩容为 5 的 1.5 倍,即 7。所以,list 的容量为 7。

2. HashMap 的扩容规则

HashMap 是一个散列表,它存储键值对。当 HashMap 中的元素数量超过其容量乘以负载因子时(默认值为 0.75),它就会自动扩容。扩容后,所有的元素都需要重新计算它们的哈希值,然后重新插入到新的桶中。

下面是 HashMap 的扩容规则:

  • 扩容因子取决于初始容量和负载因子;
  • 当元素数量超过容量乘以负载因子时,就会自动扩容;
  • 扩容后的容量是原来的两倍,但是容量必须是 2 的倍数,以使散列函数可以有效地分布元素到新的和旧的哈希桶中。

示例一:HashMap 扩容因子对容量的影响

Map<String, String> map = new HashMap<>(10, 0.6f);

在这个示例中,我们设置了初始容量为 10,负载因子为 0.6。此时,HashMap 容量的大小为 16。如果元素数量超过 16*0.6 = 9,就会自动扩容。

示例二:HashMap 扩容的影响

Map<String, String> map = new HashMap<>(4, 0.75f);
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");

在这个示例中,我们设置了初始容量为 4,负载因子为 0.75。当我们向 map 中添加第 5 个元素时,map 会自动扩容为原来的两倍,即容量为 8。此时,map 中所有的元素都需要重新计算哈希值,并重新插入到新的哈希桶中。在此之后,map 的容量为 8。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ArrayList及HashMap的扩容规则讲解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    下面我将详细讲解java中常见的几种排序算法,分别为合并排序算法、冒泡排序算法、选择排序算法、插入排序算法和快速排序算法。 合并排序算法(Merge Sort) 合并排序算法也称为归并排序,其基本思想为将待排序的序列分成若干个子序列,然后对每个子序列进行排序,最后将所有子序列合并成一个有序序列。 以下是Java实现合并排序的示例代码: public stat…

    Java 2023年5月19日
    00
  • Java实现树形List与扁平List互转的示例代码

    以下是Java实现树形List与扁平List互转的完整攻略。 1. 概述 树形结构和扁平结构是常用的数据结构之一,在业务开发过程中常常需要互相转换。本攻略给出Java实现树形List与扁平List互转的示例代码。 2. 树形List转为扁平List 树形结构的定义: public class TreeNode { private String id; pri…

    Java 2023年5月26日
    00
  • Kafka 网络中断和网络分区4种场景分析

    Kafka 网络中断和网络分区 4 种场景分析 Kafka 是一个分布式消息系统,网络连接是其正常运行的必要条件。但是,在实践中,网络中断和网络分区可能会发生,这也是 Kafka 面临的常见问题之一。本文将介绍 Kafka 网络中断和网络分区的 4 种常见场景,并提供相关的解决方案。 1. 整个 Kafka 集群网络中断 在这种情况下,整个 Kafka 集群…

    Java 2023年5月20日
    00
  • Java面试题冲刺第七天–Spring框架1

    下面是Java面试题冲刺第七天–Spring框架1的完整攻略: 一、Spring框架概述 1.1 什么是Spring框架 Spring是一个轻量级的开源Java框架,简化了企业级应用的开发。Spring框架的主要优点在于它对常见的企业应用开发任务(如访问数据库、事务管理、远程调用等)的针对性支持。 1.2 Spring框架的优势 Spring框架降低了Ja…

    Java 2023年5月19日
    00
  • 我的编程学习小圈子

    大家好,我是陶朱公Boy。(一个认真生活总想超越自己的程序员) 一线互联网Java技术专家,有超过8年+后端开发、架构经验。公众号:「陶朱公Boy」欢迎大家关注! 星球简介 一个帮你学编程、做项目、找工作少走弯路的交流圈,进步从此开始! 加入后你可以: 1.获取陶朱公原创编程学习路线、原创编程知识库、原创项目、海量编程学习资料。 2.向陶朱公和大厂嘉宾1对1…

    Java 2023年4月17日
    00
  • Java创建和启动线程的两种方式实例分析

    Java创建和启动线程的两种方式实例分析 在 Java 中,线程是并发编程的核心概念之一。线程的创建和启动是任何并发应用的首要任务之一。Java 提供了两种方式来创建和启动线程,分别是继承 Thread 类和实现 Runnable 接口。 继承 Thread 类 继承 Thread 类是最常用的创建线程的方式,实现比较简单。我们需要继承 Thread 类,重…

    Java 2023年5月19日
    00
  • jsp实现简单用户7天内免登录

    实现简单用户7天内免登录,可以采用以下步骤: 添加一个cookie,保存用户信息和登录时间。当用户勾选“7天内免登录”时,在后台生成一个cookie并设置有效期为7天,将用户信息和当前时间保存到cookie中。具体实现代码如下: <% String username = request.getParameter("username"…

    Java 2023年6月15日
    00
  • Java 画时钟遇到的问题及解决方案

    Java 画时钟遇到的问题及解决方案攻略 在 Java 中制作时钟是一个常见的练手项目,但是在制作过程中常常会遇到一些问题,接下来我们将针对这些问题提出解决方案。 问题一:闪烁 在画出时钟的时候,我们常常会发现时钟的数字或者指针出现了闪烁的情况,这是因为我们没有使用双缓冲技术,导致画面反复绘制,产生了闪烁现象。 解决方案:使用双缓冲技术,在内存中绘制好所有的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部