【JavaEE】HashMap

一、一些HashMap的成员变量

在这里插入图片描述其中:
size表示了map中的键值对个数

 /**
     * The number of key-value mappings contained in this map.
 */
transient int size;

loadFactor表示装载因子,用来衡量HashMap满的程度。loadFactor的默认值为0.75f。

/**
     * The load factor for the hash table.
     *
     * @serial
     */
    final float loadFactor;

threshold:临界值,当实际KV个数超过threshold时,HashMap会将容量扩容,threshold=容量*装载因子

 /**
     * The next size value at which to resize (capacity * load factor).
     *
     * @serial
     */
    // (The javadoc description is true upon serialization.
    // Additionally, if the table array has not been allocated, this
    // field holds the initial array capacity, or zero signifying
    // DEFAULT_INITIAL_CAPACITY.)
    int threshold;

capacity容量:默认最小容量是16.

 /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

1.1 capaticty和size的区别

如下所示测试代码,测试map的size和capacity

 public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("test", "123");

        Class mapD = map.getClass();
        Method method = mapD.getDeclaredMethod("capacity");
        method.setAccessible(true);

        System.out.println("capacity=" + method.invoke(map));
        System.out.println("size=" + map.size());
    }

输出:
在这里插入图片描述
因此capaticty: 表示最多能装多少;size:表示已经装了多少。为什么初始化容量设置成16,因为按位运算快。

也可以在初始化的时候,指定map容量大小,会默认找到比他大且离他最近的一个2的n次方。如下:

HashMap<String, String> map = new HashMap<String, String>(7);
Class mapD = map.getClass();
Method method = mapD.getDeclaredMethod("capacity");
method.setAccessible(true);
System.out.println("capacity=" + method.invoke(map));
System.out.println("size=" + map.size());

输出:
在这里插入图片描述
初始化指定的是9的化,输出就是16.

1.2 HashMap扩容机制

当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容。

HashMap<String, String> map = new HashMap<String, String>(7);
        Class mapD = map.getClass();
        Method method = mapD.getDeclaredMethod("capacity");
        method.setAccessible(true);
        System.out.println("before capacity=" + method.invoke(map));
        System.out.println("before size=" + map.size());
        System.out.println("===============================================");

        map.put("test1", "123");
        map.put("test2", "123");
        map.put("test3", "123");
        map.put("test4", "123");
        map.put("test5", "123");
        map.put("test6", "123");
        map.put("test7", "123");

        System.out.println("After capacity=" + method.invoke(map));
        System.out.println("After size=" + map.size());

输出结果为:
在这里插入图片描述
触发扩容时机:
当map的size > capacity * 0.75 就会触发扩容。上面例子,就是 size > 8*0.75 (loadFactor乘capacity),就会触发扩容,容量变为16。loadFactor乘capacity也就是阈值。

二、HashMap中hash方法的原理

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。
hashMap数据结构
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您好!对于JavaEE开发,Eclipse是一个非常流行的集成开发环境(IDE)。它为JavaEE开发者提供了丰富的功能和工具,使他们能够更轻松地构建和管理JavaEE应用程序。 在Eclipse中进行JavaEE开发,您可以使用Eclipse的JavaEE插件(通常称为Eclipse Enterprise Edition for JavaEE),它包含了一系列用于JavaEE开发的工具和模块。这些工具包括Servlet容器、JSP编辑器、EJB开发工具、数据库连接工具等等。 使用Eclipse进行JavaEE开发的步骤如下: 1. 安装Eclipse:您可以从Eclipse官方网站下载适合您操作系统的Eclipse版本,并按照安装指南进行安装。 2. 安装JavaEE插件:在Eclipse中,通过插件安装向导安装JavaEE插件。您可以在Eclipse的市场中搜索并安装适合您版本的JavaEE插件。 3. 创建JavaEE项目:在Eclipse中,可以通过菜单或快捷键创建新的JavaEE项目。选择适当的项目类型(如Dynamic Web Project、EJB Project等),并按照向导进行项目配置。 4. 开发和调试代码:在Eclipse中,您可以使用内置的编辑器编写JavaEE代码,使用调试器进行调试,并利用各种工具和视图来构建和测试您的应用程序。 5. 部署和运行应用程序:完成代码的开发和调试后,您可以将您的JavaEE应用程序部署到适当的服务器上,并启动服务器以运行您的应用程序。 当然,这只是一个简要的介绍。对于JavaEE开发,Eclipse还提供了许多其他功能和工具,如代码自动完成、版本控制、构建工具集成等等。 希望这能帮助到您!如果您还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值