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日

相关文章

  • Netty分布式行解码器逻辑源码解析

    Netty分布式行解码器逻辑源码解析 Netty是一款基于Java的NIO框架,主要用于开发高性能、高可靠性的网络通信服务器和客户端,其支持各种应用协议,如HTTP、SMTP、WebSocket、Telnet等。其中,Netty分布式行解码器是其常用的一个功能,本文将对其进行详细的源码解析和使用攻略。 什么是Netty分布式行解码器 Netty分布式行解码器…

    Java 2023年5月20日
    00
  • Java lambda 循环累加求和代码

    下面是Java lambda 循环累加求和代码的完整攻略。 什么是Lambda表达式? Lambda 表达式是 Java 8 版本引入的一种新特性,是一个匿名函数,可以将其作为一个方法的参数或者返回值,并且可以依据需要自行定义它的参数类型。 Lambda 在 Java 中的语法格式如下: (parameters) -> expression or (p…

    Java 2023年5月19日
    00
  • 一文详解Springboot集成mybatis-plus

    下面我将详细讲解“一文详解Springboot集成mybatis-plus”的完整攻略,过程中将包含两条示例。 一、前言 Springboot集成mybatis-plus是一个非常常见的技术选型,它能够帮助我们快速地构建出一个高效且易于维护的项目。在本文中,我将详细讲解Springboot集成mybatis-plus的完整攻略以及过程。 二、准备工作 在开始…

    Java 2023年5月19日
    00
  • JAVA实现感知器算法

    实现感知器算法可以通过Java语言来完成。下面是实现感知器算法的完整攻略: 算法简介 感知器算法是一种基础的人工神经网络算法,它的运行原理是根据学习结果对指定的输出结果进行二元决策。感知器算法能够实现二分类,也就是将输入数据划分为两类,如True和False,1和0等。以下是感知器算法的主要步骤: 初始化权重 得到输入的训练数据 计算感知器输出 根据误差调整…

    Java 2023年5月18日
    00
  • JSP组件commons-fileupload实现文件上传

    以下是使用JSP组件commons-fileupload实现文件上传的详细攻略: 环境准备 首先需要在项目中引入commons-fileupload组件,可以在Maven中添加以下依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId&gt…

    Java 2023年6月15日
    00
  • Java基于Calendar类输出指定年份和月份的日历代码实例

    Java基于Calendar类输出指定年份和月份的日历代码实例如下: import java.util.*; public class CalendarExample { public static void main(String[] args) { // 声明并获取Calendar对象 Calendar calendar = Calendar.getIn…

    Java 2023年5月20日
    00
  • 浅谈java中异常抛出后代码是否会继续执行

    浅谈Java中异常抛出后代码是否会继续执行 什么是异常 在Java编程中,异常指的是一个事件,它会在程序执行期间发生,影响了程序正常的执行流程。在Java中,异常是一个对象,它是Throwable类或它的子类的实例。 比如在进行整型变量除以0的操作的时候就会抛出一个异常,这个时候程序不会顺着正常的执行流程走下去,而是会跳出目前的代码执行流,转而执行异常处理流…

    Java 2023年5月27日
    00
  • springboot 多模块将dao(mybatis)项目拆分出去

    下面我来详细讲解一下“springboot 多模块将dao(mybatis)项目拆分出去”的完整攻略。 1. 拆分dao(mybatis)项目 1.1 新建dao模块 首先,我们需要在springboot项目中新建一个单独的dao模块,用于存放mybatis相关的代码。这个模块的pom.xml文件需要引入mybatis、mybatis-spring和mysq…

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