HashMap源码 2

HashMap的构造函数大部分可以略过,挑了个进行分析

  1. public HashMap(Map<? extends K, ? extends V> m)
    该构造函数,把已存在的Map添加至一个新的Map,该函数调用了putMapEntries(Map<? extends K, ? extends V> m, boolean evict)方法
    final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
            int s = m.size();
            if (s > 0) {
                if (table == null) { // pre-size
                    float ft = ((float)s / loadFactor) + 1.0F;    // 根据加载因子获取长度
                    int t = ((ft < (float)MAXIMUM_CAPACITY) ?    // 判断是否大于最大容量
                             (int)ft : MAXIMUM_CAPACITY);    // 返回长度
                    if (t > threshold)    // threshold默认为0
                        threshold = tableSizeFor(t);    // 获取最近的2的整数次幂的数作为长度
                }
                else if (s > threshold)    // 如果m的长度大于threshold
                    resize();    // 扩展map长度
                for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
                    K key = e.getKey();
                    V value = e.getValue();
                    putVal(hash(key), key, value, false, evict);    // 把m的节点添加至该map
                }
            }
        }
  2. get()方法:
    public V get(Object key) {
            Node<K,V> e;
            return (e = getNode(hash(key), key)) == null ? null : e.value;    // 判断是否存在相同的key,有则返回value,否则返回null
        }
    大致过程为:
    对key的hashCode()做hash,然后再计算index
    如果该 index 下没有值,则直接返回 null
    index 下有值,判断 table 数组中该下标处第一个节点是否命中,命中则直接返回
    未命中,则判断去树结构中查找,或者去链表结构中查找,找到则返回

    final Node<K,V> getNode(int hash, Object key) {
            Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
            if ((tab = table) != null && (n = tab.length) > 0 &&
                (first = tab[(n - 1) & hash]) != null) {    // 如果哈希表容量为0或者关键字没有命中,直接返回null
                if (first.hash == hash && // always check first node    // 第一个节点的hash是否和key的hash相等
                    ((k = first.key) == key || (key != null && key.equals(k))))    // hash碰撞检测,如果hash相同,则调用equals进行判断
                    return first;    // 如果链表第一个节点的key和hash都相等,表示存在相同的节点,则调用该节点
                if ((e = first.next) != null) {    // 是否存在下一个节点
                    if (first instanceof TreeNode)    // 判断该节点是否红黑树,以红黑树的方式查找
                        return ((TreeNode<K,V>)first).getTreeNode(hash, key);
                    do {    // 遍历链表查找
                        if (e.hash == hash &&
                            ((k = e.key) == key || (key != null && key.equals(k))))    // key和hash都相等,表示存在相同的节点,则调用该节点
                            return e;
                    } while ((e = e.next) != null);
                }
            }
            return null;
        }
  3. public boolean containsKey(Object key) 
    return getNode(hash(key), key) != null;
    判断该map是否存在key节点
  4. put()方法:
    public V put(K key, V value) {
            return putVal(hash(key), key, value, false, true);
        }

    大致过程为:
    对key的hashCode()做hash,然后再计算index
    如果没碰撞直接放到bucket里
    如果碰撞了,以链表的形式存在buckets里
    如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD,默认为8),就把链表转换成红黑树
    如果节点已经存在就替换old value(保证key的唯一性)
    如果bucket满了(超过load factor * current capacity),就进行resize

内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值