ArrayList及HashMap的扩容规则讲解

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 抓取网页内容实现代码的完整攻略分为以下几个步骤: 建立与目标网站的网络连接。 Java 通过 URL 对象建立与目标网站的网络连接。URL 对象通过带参数的构造函数传入要访问的网站地址。 URL url = new URL("https://www.example.com"); 获取网络连接的输入流。 通过 URL 对象的 op…

    Java 2023年5月23日
    00
  • java正则实现各种日期格式化

    下面详细讲解“Java正则实现各种日期格式化”的完整攻略。 什么是日期格式化? 日期格式化是指将日期转换为特定的字符串格式。在Java编程中,我们经常需要使用日期格式化来将日期按照我们的要求进行显示。 Java日期格式化 在Java中,日期格式化可以使用SimpleDateFormat类。SimpleDateFormat类可以支持许多不同的日期格式,比如年月…

    Java 2023年5月20日
    00
  • Springboot 2.x集成kafka 2.2.0的示例代码

    下面我就来详细讲解一下“Springboot 2.x集成kafka 2.2.0的示例代码”的完整攻略。 简介 Kafka 是一个高吞吐量的分布式消息队列系统,常被用于日志处理、消息系统等场景。Spring Boot 是目前流行的 Java Web 开发框架,具有简单、快速、方便等特点。本文将介绍如何在 Spring Boot 2.x 中集成 Kafka 2.…

    Java 2023年6月2日
    00
  • 深入Ajax代理的Java Servlet的实现详解

    “深入Ajax代理的Java Servlet的实现详解”是一篇介绍如何使用Java Servlet实现Ajax代理的文章。本文一共分为以下几个部分: Ajax代理的概念及作用 Java Servlet的基础知识 使用Java Servlet实现Ajax代理的步骤 示例说明 1. Ajax代理的概念及作用 Ajax代理是一种通过服务器中转Ajax请求的技术。在…

    Java 2023年6月16日
    00
  • Java中ShardingSphere 数据分片的实现

    非常感谢您对“Java中ShardingSphere 数据分片的实现”的关注。下面是大致的攻略: 1. 什么是ShardingSphere ShardingSphere是一个开源的分布式数据库中间件解决方案,提供数据库分片、分布式事务、数据治理等功能。它由Apache ShardingSphere孵化经过一年多的孵化过程,于2021年2月正式成为Apache…

    Java 2023年5月20日
    00
  • Java实战练习之扑克牌魔术

    Java实战练习之扑克牌魔术攻略 1. 简介 本篇攻略主要针对Java实战练习之扑克牌魔术进行讲解。扑克牌魔术是一种常见的魔术表演方式,需要使用特定的算法和技巧来实现。在本次攻略中,我们会讲解如何使用Java来实现扑克牌魔术表演。 2. 准备工作 在开始实战练习之前,需要先准备好以下工具和素材: Java开发环境,建议使用JDK 8及以上版本; Eclips…

    Java 2023年5月23日
    00
  • Redis妙用之存储用户token问题

    下面是关于“Redis妙用之存储用户token问题”的完整攻略。这是一个用Redis来存储用户token的应用场景,主要是为了解决分布式系统中的用户身份验证问题。 1. 背景介绍 在分布式系统中,使用token来进行用户身份验证是很常见的做法。当用户登录系统时,系统会创建一个token,并将该token返回给用户。用户在接下来的请求中,会在请求头或者请求体中…

    Java 2023年5月26日
    00
  • 详解如何在项目中应用SpringSecurity权限控制

    一、Spring Security介绍 Spring Security是为Java应用程序提供身份验证和授权框架的安全框架。它是基于Spring框架构建的,并为REST API,SOAP服务和Web应用程序提供安全性。通过在应用程序中提供针对身份验证和授权的支持,Spring Security可以有效地确保应用程序的安全性。 二、添加Spring Secur…

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