HashMap源码阅读
hashMap源码解读
文章目录
- hashMap源码解读
- 常量
- 数据结构
- 哈希码计算
- 添加元素
- resize
- 构造函数
- tableSizeFor
- get
- 1.7 尾插法扩容为什么会有死循环
常量
常量名 | 类型 | 默认值 | 描述 |
---|---|---|---|
DEFAULT_INITIAL_CAPACITY | int | 1<<4 = 16 | 默认初始化容量大小 |
MAXIMUM_CAPACITY | int | 1<<30 | table最大长度,超过这个容量不再对table扩容 |
DEFAULT_LOAD_FACTOR | float | 0.75f | 默认负载系数,大于这个比例之后将进行扩容 |
UNTREEIFY_THRESHOLD | int | 6 | 扩容时,某个哈希键上的元素小于6个时,数据结构由红黑树退化成链表 |
TREEIFY_THRESHOLD | int | 8 | 扩容时,由链表进化成树的阈值,大于8个元素进化成红黑树 |
MIN_TREEIFY_CAPACITY | int | 64 | 哈希键的个数小于64时,不进化成红黑树,原因是这时应该扩充键值数量来减少冲突. |
threshold(非常量) | int | 当size大于该值时进行扩容操作threshold = capacity*loadFactory | |
loadFactory(非常量) | float | 0.75f | 负载系数 |
数据结构
节点的数据结构由一个静态内部类Node<K,V>定义,实现了Map.Entry<K,V>接口
由四个属性构成
final int hash;//哈希结果
final K key;//key值
V value;//value值
Node<K,V> next;//指向下一个节点的指针
整体的结构是hash表使用数组存储,处理冲突采用链式方法处理,java8之后,联表长度大于定值会进化成红黑树.
哈希码计算
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
哈希值没有直接使用实例的hashcode方法进行计算,而是通过上面的hash方法重新计算了一遍.
计算方式是,key实例的hashcode值高16位不变,低16位与高16位的异或结果得到最终的hash值,当key为null时,hashcode为0.
为什么要这样做呢?
首先介绍一下hashmap中哈希取模计算的方式
hashmap中哈希键值的个数为2的次幂,这时取模运算可以使用按位与运算代替
(n - 1) & hash]) == null)//使用按位与计算取模,n是table的长度
2进制的x次幂的结果用二进制表示为1000…的形式(1后面跟x个0),而(n-1 = 01111…),将hash与(n-1)按位与时,由于高位全为0,只有低位的1参与运算,就相当于对hash按n进行了取模运算.
回到刚才的话题,由于只有低x位参与运算,如果按照传统的方式对原始的key的hashcode进行取模运算,会导致高位不参与运算,这样的话会导致每个哈希键上的值分布的不均匀.而使用h = key.hashCode()) ^ (h >>> 16)可以让高16位也参与运算,让分布变得更加均匀.
添加元素
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)//如果table的为null,或者长度为0,新建一个tablen = (tab = resize()).length;//计算取模结果i,判断插入位置i是否为空(没有冲突)if ((p = tab[i = (n - 1) & hash]) == null)//新建节点,并将节点复制给table上的第i个元素tab[i] = newNode(hash, key, value, null);else {//如果插入位置有冲突Node<K,V> e; K k;//判断插入的key值刚好等于table头节点的key值if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))//将头结点赋值给ee = p;else if (p instanceof TreeNode)//如果不与头节点相等,而且p位置使用的是红黑树,则使用putTreeVal插入元素,并返回插入的节点ee = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {//如果是使用链表存储冲突元素for (int binCount = 0; ; ++binCount) {//循环遍历到链表尾部(没有相同元素)if ((e = p.next) == null) {//在链表尾部插入新节点p.next = newNode(hash, key, value, null);//判断插入新节点后,链表长度是否超过阈值TREEIFY_THRESHOLD,如果超过的话,将联表进化成红黑树if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}//如果遍历过程中发现相等元素.终止遍历,这时e指向相等节点if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;//替换元素p = e;}}//如果e不等于null,并且onlyIfAbsent=false(hashmap使用的fasle),或者原value值为null,则会替换节点的value.if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;//为linkedhashmap预留的节点处理方法afterNodeAccess(e);return oldValue;}}++modCount;//判断是否需要扩充tableif (++size > threshold)resize();//为linkedhashmap预留的节点处理方法afterNodeInsertion(evict);return null;
}
resize
resize方法用于table的初始化和乘二扩容,假设原table长度为nnn,由于扩容都是乘2的,所以原来的节点要不还在原来的哈希键的位置上,要不在原哈希值+n原哈希值+n原哈希值+n位置上(在取模时多一位高位参加运算(按位与,因为扩容后的计算哈希值时高位多了一位1),当这一位是1时,hash结果=原哈希值+n原哈希值+n原哈希值+n,是0时hash值不变).
比如原来table的长度是8,二进制表示为0000 1000,按照 (n - 1) & hash计算哈希值.设插入元素的hash值=0001 0001
n-1 = 0000 $\color{red}0$111 n-1 = 0000 $\color{red}0$111
hash = 0001 $\color{red}1$011 hash = 0001 $\color{red}1$011
结果 = 0000 $\color{red}0$001 结果 = 0000 $\color{red}0$001
相当于只有后三位参加&运算,hash值的倒数第4位相当于未参加运算(和0进行& = 0)
现在扩容了 新的table长度为16, 二进制表示n = 0001 0000, n-1 = 0000 1111
n-1 = 0000 $\color{red}1$111 n-1 = 0000 1111
hash = 0001 $\color{red}1$011 hash = 0001 $\color{red}0$011
结果 = 0000 $\color{red}1$001 结果 = 0000 $\color{red}0$001
现在有后四位参与运算,当hash值的倒数第四位为0时,结果与原table相同,当倒数低四位为1时,结果=原值+原哈希表长度
final Node<K,V>[] resize() {//原tableNode<K,V>[] oldTab = table;int oldCap = (oldTab == null) ? 0 : oldTab.length;//扩容阈值,大于这个容量会扩容int oldThr = threshold;int newCap, newThr = 0;//判断新table长度的过程//首先,如果oldTable长度大于0if (oldCap > 0) {//判断当前table的长度是否已超过最大容量if (oldCap >= MAXIMUM_CAPACITY) {//超过的话不扩容,直接返回,并将Integer.MAX_VALUE赋值给thresholdthreshold = Integer.MAX_VALUE;return oldTab;}//如果table扩容后长度小于最大长度,并且当前table长大于默认长度,则table长度乘2else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&oldCap >= DEFAULT_INITIAL_CAPACITY)newThr = oldThr << 1; // double threshold}//如果table长度为0(未初始化),并且扩容阈值threshold大于0,则新table的长度为threshold,这种情况适用于new hashMap(inc initialCapacity)时传入了初始容量的情况,这是threshold会初始化为大于initialCapacity的最小2的n次幂的值,比如传入7,则初始table的长度为8,传入14,初始table的长度为16,这个值的初始化函数tableSizeFor(int cap)很有意思,下面再讲else if (oldThr > 0) // initial capacity was placed in thresholdnewCap = oldThr;else { // zero initial threshold signifies using defaults//如果oldtable长度为空,并且使用的new hashMap构造函数,没有传入初始容量,则没法计算初始阈值,这是使用默认的容量和阈值.默认容量为16,负载系数为0.75,扩容阈值threshold = 16 *0.75 = 12 newCap = DEFAULT_INITIAL_CAPACITY;newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}//如果计算出来的阈值=0,则根据容量和负载系数等计算阈值if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?(int)ft : Integer.MAX_VALUE);}//将计算出来的阈值赋值给全局变量thresholdthreshold = newThr;@SuppressWarnings({"rawtypes","unchecked"})//根据上面计算出来的新table的长度newCap,新建table数组newTabNode<K,V>[] newTab = (Node<K,V>[])new Node[newCap];//将table指向新table数组table = newTab;//数据重新映射过程.注意这个过程是线程不安全的,多线程情况下,多个线程同时操作node的指向,这样可能会导致链表循环引用if (oldTab != null) {//按哈希键逐个重新映射for (int j = 0; j < oldCap; ++j) {Node<K,V> e;//判断原table上,oldTab[j]是否为null,不为null时将e指向该hash键if ((e = oldTab[j]) != null) {//释放原table上的该哈希键上的引用oldTab[j] = null;//如果该链表只有一个元素(即只有table上的存储的头结点元素)if (e.next == null)//该节点重新计算哈希值后赋值给newTab的对应位置.newTab[e.hash & (newCap - 1)] = e;else if (e instanceof TreeNode)//如果使用的树结构存储,调用split方法进行重新映射((TreeNode<K,V>)e).split(this, newTab, j, oldCap);else { // preserve order//如果是链表存储,遍历链表,重新映射,这里使用一种特殊的方法分两步进行重新映射//首先将链表按照(e.hash & oldCap) == 0是否等于0将原联表分成两个链表.这样做的原因,在table进行乘2扩容后,对于一条链上的数据,只有两种新的映射结果,一种是还等于原hash值,另一种是=原哈希值+原table长度,当(e.hash & oldCap) == 0时,说明e.hash再倒数第n位上元素为0,则其新的哈希映射结果与原table相同,当等于1时,映射结果=原哈希值+原table长度Node<K,V> loHead = null, loTail = null;Node<K,V> hiHead = null, hiTail = null;Node<K,V> next;do {next = e.next;if ((e.hash & oldCap) == 0) {if (loTail == null)loHead = e;elseloTail.next = e;loTail = e;}else {if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);//分成两个列表直接将新的链接头节点的指针复制给新table数组的对应位置即可,这样就完成可扩容if (loTail != null) {loTail.next = null;newTab[j] = loHead;}if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}return newTab;
}
构造函数
有三个构造函数
public HashMap(int initialCapacity, float loadFactor) {//初始容量参数校验if (initialCapacity < 0)throw new IllegalArgumentException("Illegal initial capacity: " +initialCapacity);//指定容量大于最大容量.使用最大容量(2<<<30)if (initialCapacity > MAXIMUM_CAPACITY)initialCapacity = MAXIMUM_CAPACITY;//负载参数校验if (loadFactor <= 0 || Float.isNaN(loadFactor))throw new IllegalArgumentException("Illegal load factor: " +loadFactor);this.loadFactor = loadFactor;//获得大于initialCapacity初始容量最小的2的次幂的数this.threshold = tableSizeFor(initialCapacity);
}
//指定初始容量,负载使用默认负载
public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR);
}public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
比较有意思的一点是,hashmap使用了延迟加载的策略,new HashMap时并不会把table等new出来,只要put的时候,才会再resize中判断table是否为null,如果为null再创建table.
tableSizeFor
获得大于initialCapacity初始容量最小的2的次幂的数
/*** Returns a power of two size for the given target capacity.*/
static final int tableSizeFor(int cap) {int n = cap - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
第一行的减一是避免得到的结果大于2<<<30,int型去掉符号位有31个字节,2<<<30已经是int型能表示的最大2的整数次幂结果
n |= n >>> 1; 表示 n = n |(n>>>>1),假设n的二进制数,最高为等于1的数在第k位上,这一行的结果是将n的第k+1位变成1
n |= n >>> 2;由于n的第k和k+1位都是1,这一行的结果是n的第k到k+1+2位中间所有元素都是1,
n |= n >>> 4; 结果是n的第k到第k+1+4位元素都变成1
…
最后得到的结果是n从第k位开始到最后一位都是1(形如00011111)
再将n+1 = 00100000 刚好是比n大的最小的2的次幂结果
get
public V get(Object key) {Node<K,V> e;return (e = getNode(hash(key), key)) == null ? null : e.value;
}/*** Implements Map.get and related methods.** @param hash hash for key* @param key the key* @return the node, or null if none*/
final Node<K,V> getNode(int hash, Object key) {Node<K,V>[] tab; Node<K,V> first, e; int n; K k;//参数校验,判断table是否为空,计算哈希结果,校验对应位置联表是否为空,校验失败返回nullif ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) {//判断链表的头节点是否等于传入的key值if (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k))))return first;//遍历查找,找到返回节点,找不到返回nullif ((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))))return e;} while ((e = e.next) != null);}}//未找到符合的key值,返回nullreturn null;
}
1.7 尾插法扩容为什么会有死循环
https://blog.csdn.net/weixin_44029692/article/details/89197432?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
主要还是头插法会改变原有链表的顺序而尾插法不会
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 数组排序之选择排序和Arrays类提供的方法
选择排序 选择排序:外层循环控制轮数,内层循环控制次数,经过一大轮的比较之后,先会记录数组中的最值的下标,再将最值的下标和数组的第一个元素进行交换,所以经过第一大轮之后会得到一个最值,再…...
2024/5/2 1:47:26 - win借助任务计划程序实现开机自启、定时重启nginx
1. 打开任务计划程序 2. 点击右侧创建任务 输入名称、描述等信息勾选不管用户是否登录都要运行 3. 点击触发器标签 点击新建在弹窗中的开始任务中选择启动时确定 4. 点击操作标签 新建在程序或脚本选择nginx.exe所在位置(也就是nginx.exe的绝对路径)在添…...
2024/4/13 20:49:31 - c++协程库libfiber之3:调度协程的三种方式
简洁 前一篇博客介绍了libfiber里使用协程的简单方法,这里介绍下调度协程的三种方式 自动调度,立即执行 这种模式下,创建的协程会被立即执行,协程结束后才返回创建处的代码逻辑。 void schedule_two(void) {acl::fiber::init(acl::FIBER_…...
2024/4/21 19:49:35 - C++ 数组总结
数组 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量, 比如 number0、number1、...、number99࿰…...
2024/4/30 2:51:45 - 不一样的数据类型-Java
不一样的数据类型-JavaJava变量及数据类型Java变量创建变量常量变量的种类实例变量类变量局部变量参数Java中的数据类型整型浮点数布尔类型字符串类型常见错误,不要超出其最大值Java变量及数据类型 Java变量 Java中我们通过三个元素描述变量:变量类型&a…...
2024/4/6 7:35:51 - 微软Surface Book 3上面安装ubuntu20和win10双系统
先说结论,是可以的,完美支持各项功能。 回头有时间来更新细节。...
2024/5/2 3:46:29 - 重装Windows系统 入门详解 - 基础教程
重装Windows系统 入门详解 - 基础教程 JERRY_Z. ~ 2020 / 10 / 13 转载请注明出处!❤️ 文章目录重装Windows系统 入门详解 - 基础教程一、说明二、具体步骤(1)、U盘备份数据(2)、打开【设置】(3)、打开【更新和安全】(4)、打卡【恢复】(5)、点击【重置此电脑 开始】…...
2024/5/1 21:59:53 - tableau desktop实现
数据来源:示例超市 1. 新建工作表,加载数据源 2. 处理数据 新建利润率字段:利润率sum(利润)/sum(销售额) 图13.各地区销售概览-可视化 3.1可视化了解公司在国内各个地区的销售情况:细节备注:…...
2024/5/2 1:44:55 - C++学习 2.8常引用、常对象、常对象成员、常成员函数
常引用 作用:常引用所引用的对象不能被更新。 常引用的说明形式: const 类型& 引用名 例如: int a; const int& ba;// b是常引用,不允许被更改 b2; // 错误 常对象 作用:常对象中的数…...
2024/5/1 23:30:15 - springboot继承JPA进行分页处理
**Jpa进行分页处理可以使用PageRequest ** //分页查询全部Userspublic List<Users> getListUser(int page,int size){PageRequest prPageRequest.of(page,size);//这里直接调用PageRequst的of方法Page<Users> usersPageur.findAll(pr);//将条件存入findAllList<…...
2024/5/2 6:21:16 - JavaScript入门
三种基础数据类型 text(字符串)、number、boolean(true或false) alert框只能呈现文本,无法列出数字 当数字与文本混合时,数据“必定”视为文本 创建变量 var 变量名称 值;(初始…...
2024/5/1 21:46:28 - 编写代码时,光标变成了选字符,而不是竖线
编写代码时,光标变成了选择字符,而不是竖线 问题:今晚写代码时,某个关键字写错了,要删除修改的时候,移动光标,竖线不是在两个字母中间了,而是覆盖了一个字母,这样我想要删…...
2024/5/2 3:54:48 - git闭坑指南(执行更新)
使用git管理代码带来很大的便利,但是在来回切换分支的同时,常常也会产生一些误操作。 (一)恢复已commit未push的代码 1.git log 找到之前提交的 commit_id;2.1.git reset –hard id 完成撤销,同时将代码恢复到前一commit_id 对应…...
2024/4/23 1:18:07 - 第3章-基本概念-精读《JavaScript高级程序设计(第3版)》
1、语法 1.1、区分大小写 变量、函数名和操作符都区分大小写。 1.2、标识符 指变量、函数和属性的名字,或者函数的参数。格式规则如下: 首字符必须为字母、下划线(_)或美元符号($)其他字符可以是字母、…...
2024/5/1 22:59:46 - ionic4.x仿京东 - 11.Angular路由守卫,登录权限判断
一、路由守卫 1、概念——当用户满足一定条件才被允许进入或者离开一个路由。 2、路由守卫场景: 只有当用户登录并拥有某些权限的时候才能进入某些路由。一个由多个表单组成的向导,例如注册流程,用户只有在当前路由的组件中填写了满足要求…...
2024/5/2 4:24:53 - Android反编译之dex2jar+jd-gui-windows
今天记录一下使用dex2jarjd-gui-windows来对apk进行反编译,dex2jar和jd-gui-windows请大家自行下载。 将下载好的dex2jar.zip解压,内容如下:把 xx.apk改为xx.zip并解压,内容如下: 把classes.dex放入的dex2j…...
2024/4/24 21:30:29 - 一个快速排序的例子
void quick_sort(int a[], int left, int right) {int n left, m right;int key a[n];if (n > m)return ;while (n < m){//从右边往左边找比key小的while (n < m && a[m]>key)m--; //如果找到了要填前面的坑if (n < m)a[n] a[m];else break;//从左边…...
2024/5/2 2:01:31 - 对于给定的一个大于 11 的正整数 NN(你可以认为测评机给出的 NN 均小于 10001000),按从小到大的顺序输出所有小于等于它的质数。
对于给定的一个大于 11 的正整数 N(你可以认为测评机给出的 N 均小于 1000),按从小到大的顺序输出所有小于等于它的质数。 质数:除了1和本身没有其他除数 思路:2是最小的质数,输出时必有2;一个…...
2024/4/21 14:36:18 - OpenCV学习笔记(七)
漫水填充: 漫水填充法是一种用特定颜色填充连通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的方法,主要针对连通区域 漫水填充常被用来标记或分离图像的一部分,以便对其进行进一步处理或分析,…...
2024/4/23 1:34:34 - 输入十个数,求最大值
#include<stdio.h> int main() {int num[10],i,j; // 定义数组和变量;以后如无特殊情况不再说明变量for(i0;i<10;i){scanf("%d",&num[i]);} // 此处为送入数据,以后不再说明;此处大括号可要可不要…...
2024/5/1 22:31:26
最新文章
- 【设计模式】使用策略模式优化表单校验逻辑
什么是策略? 所谓策略,就是根据已知条件决定要做出怎样的行为。 举个栗子:我要实现一个表单校验功能,要求 name 不能为空且长度必须大于 2 且小于 4,age 不能为空且必须为纯数字。 这样的判断逻辑直接用 if-else 就…...
2024/5/2 6:52:52 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 【GIS学习笔记】polygon和multipolygon的转换
写得比较全的polygon和multipolygon的介绍: https://www.cnblogs.com/billygisboy/p/17415573.html 从文本文件上看二者的区别就是"type":"Polygon"和"type":"MultiPolygon",以及MultiPolygon多一层[]或()。 …...
2024/4/30 4:11:50 - STM32实现软件SPI对W25Q64内存芯片实现读写操作
先看看本次实验的成果吧: 这么简单的一个程序,我学习了一个星期左右,终于把所有的关节都打通了。所有代码都能什么都不看背着敲出来了。为了使自己的记忆更为清晰,特意总结了一个思维导图,感觉自己即便是日后忘记了看一…...
2024/5/1 12:08:49 - 大唐杯历届省赛押题训练(6)
考试-呼叫建立流程 一、单选题 1下面关于T-ADS被叫域选择下面说法正确的是( )1分/1分 A、被叫域选择是由MME发起的信令过程 B、T-ADS,过程是AS向3合1融合数据库查询T-ADS信息的过程 C、被叫域选择由主叫UE发起的域选择过程 D、主要是解决主叫驻留在那个网络的问题 提…...
2024/5/2 5:38:36 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/1 10:25:26 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/1 13:20:04 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/1 21:18:12 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/1 4:07:45 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/30 23:32:22 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/2 6:03:07 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/1 6:35:25 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/1 11:24:00 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/2 5:31:39 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/1 20:22:59 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/30 22:14:26 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/1 6:34:45 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/2 0:07:22 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/30 20:39:53 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/1 4:45:02 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/1 8:32:56 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/1 14:33:22 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/1 11:51:23 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/1 5:23:20 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/1 20:56:20 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57