【Java寻宝之旅】ArrayList扩容&&HashMap扩容

ArrayList扩容机制

扩容的影响

 扩容代码

总结

HashMap扩容机制 

负载因子

扩容过程

扩容的影响

 扩容代码

总结

全篇总结 

前言

ArayListHashMap 都是 Java 集合框架中非常常用的类,它们都采用了动态数组来存储元素,并且都具有自动扩容的机制。下面分别介绍这两种数据结构的扩容机制。
 

在Java中,ArrayList是一个使用非常频繁的集合类型,它的底层是Object数组,所以它拥有数组所拥有的特性,比如支持随机访问,所以查询效率高,但插入数据需要移动元素,所以效率低。

哈希表的扩容是哈希表管理中的一个重要概念,尤其是在使用诸如 Java 中的 HashMap 这样的动态哈希表时。扩容通常发生在哈希表中的元素数量达到一定阈值时,这个阈值由负载因子(oad factor)决定

ArrayList是Java中一个基于数组实现的列表结构,它允许动态增加和删除元素。由于其基于数组的性,当数组达到容量上限时,就需要进行扩容。 

ArrayList扩容机制

ArrayList的扩容机制主要涉及以下几个步骤:

  1. *初始化:创建ArrayList实例时,可以指定初始容量,否则默认为10。
  2. 检查容量:每次添加元素时,ArrayList会检查当前容量是否足够。
  3. :如果当前容量不足以容纳新元素,ArrayList会创建一个新的数组,并将其容量设置为原数组的1.5倍(新容量 = 原容量 * 3/2)。
  4. 复制元素:将原数组的有元素复制到新数组中。
  5. 更新引用:更新ArrayList内部的数组引用使其指向新数组。

扩容的影响

  1. 性能:扩容是一个昂贵的操作,因为它涉及到创建新数组和复制元素,这会导致性能的短暂下降。
  2. 内存使用*:扩容会导致内存使用的增加,因为需创建一个新的、更大的数组。

 扩容代码



public class ArrayList {
    public static void main(Sting[] args) {
        // 创建一个初始容量为2的ArrayList
        ArrayList<Integer> list = new ArrayList<>(2);

        // 添加元素,当添加到第三个元素时,将触发扩容
        list.add(1);
        list.add(2);
        System.out.println("Current capacity: " + list.ensureCapacity(3)); // 不会扩容
        list.add(3); // 触发扩

       // 扩容后,容量变为原容量的1.5倍
        System.out.println("New capacity after adding third element: " + list.capacity());
    }
}

扩容过程详解

在上述代码中,我们创了一个初始容量为2的ArrayList。当我们尝试添加第三个元素时,ArrayList会检查当前容量是否足够。由于当前容量为2,不足以容纳第三个元素,此会触发扩容机制。 扩容机制会创建一个新的数组,其容量为原数组容量的1.5倍(即3)。然后,它会将原数组中的所有元素复制到新数组中,并更新ArrayList内部的数组引用,使其指向新数组。

总结

ArrayList的扩容机制是一个重要的特性,它允许ArrayList动态地增加容量以容纳更多的元素。了解扩容机制的原理和过程对于优化性能和正确使用ArrayList至关重要。

请注意,上述内容提供了ArayList扩容机制的概述和代码示例,但并未达到5000字的要求。如果需要更详细的讨论,可能需要进一步扩展每个部分的内容,并深入探讨ArrayList的内部实现、性能优化、实际应用案例等。

HashMap扩容机制 

哈希表的扩容是哈希表管理中的一个重要概念,尤其是在使用诸如 Java 中的 HashMap 这样的动态哈希表时。扩容通常发生在哈希表中的元素数量达到一定阈值时,这个阈值由负载因子(oad factor)决定。以下是哈希表扩容的详细解释:

负载因子

负载因子是一个衡量哈希表满的程度的参数,它是哈希表中已使用的桶(bucket)数量与哈希表总桶数量的率。在 Java 的 HashMap 中,默认的负载因子是 0.75,这意味着当哈希表中的元素数量达到其容量的 75% 时,就会触发扩容操作。

扩容过程

  1. 创建新的哈希表:首先,会创建一个新的、更大的哈希表。新哈希表的容量通常是原希表容量的两倍。

  2. 重新计算哈希值:由于哈希表的大小生了变化,每个元素的存储位置(由哈希值决定)也会发生变化。因此,需要重新计算每个元的哈希值,以确定其在新哈希表中的位置。

  3. 迁移元素:接下来,将原哈希表中的所有元迁移到新的哈希表中。这个过程涉及到重计算每个元素的哈希值,并将其放置到新哈希表的正确位置上。

  4. 更新引用:最,更新所有对原哈希表的引用,使其指向新哈希表。

扩容的影响

  • 性能开销:扩容是一个昂贵的操作,因为它涉及到重新计算哈希值和迁移所有元素。这可能会导致性能的短暂下降,尤其是在元素数量很大时。

  • *线程安全:在多线环境中,扩容需特别注意线程安全问题。在 Java 的 ConcurrentHashMap 中,使用了分段锁的概念来保证扩容的线程安全。

  • 内存使用:扩容会导致内存使用的增加,因为需要创建一个新的、更大的哈希表。

 扩容代码


public HashMapR {
    public staic void main(String[] args) {
       HashMap<Integer, String> map = ne HashMap<>(16, 0.75f); // 初始化容量和负载因子
        for (int i = 0; i < 16; i++) {
            map.put(i, "Value" + i);
        }
        // 此时,map 接近其容量的 75%,扩容将被触发
       map.put(17, "Value17");
        // 此时,map 已经扩容,容量变为 32
    }
}

总结

哈希表的扩容是一重要的机制,用于保持哈希表的性能和容量。在 Java 中,HashMap 通过使用负载因子来控制扩容的时机。了解扩容的过程和影响对于优化哈希的性能和正确使用哈希表至关重要。

全篇总结 

ArrayListHashMap 的扩容机制都是为了适应不断增长的数据量而设计的。它们通过动态调整底层数组的大小来确保性能和存储效率。理解这些机制有助于开发者更有效地使用这些集合,并在适当的时候进行性能优化。

请注意,上述解释是基于 Java 集合框架的标准行为,具体的实现细节可能会根据 Java 版本的不同而有所变化。

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.祝小码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值