HashMap详解以及常见面试题

一、概要

本文先会将hashmap的基本概念属性梳理一遍后,再从增删改查方法中每个步骤逐一解释说明。力求达到通熟易懂,逻辑清晰,便于加深印象。

二、概念

首先Hashmap的底层数据结构是由数组+链表组成的,是线程不安全,允许key和value为null。底层结构数组叫哈希桶,而桶内则是链表,链表中的节点Node存放着实际的元素。

Hashmap中获取元素时的主要流程步骤为,首先对key值进行hash算法得出hash值即哈希桶中的索引值,再找到对应的hash桶。如果存在,则通过(拉链法)链表从前往后比较value值是否相等,直到找到元素或下个节点为null时。
而增加元素或修改元素的主要流程步骤与获取相类似,不同在于当增加元素后,如果总元素size大于阈值时,会发生扩容。
在JDK8中,加强了hash算法的效率以及利用率,当桶内元素大于8和所有元素总数大于64时,将链表转换为红黑树,优化了扩容时的算法。

三、分解

1. hash算法

在上面概念中讲到,hash算法是计算key值对应哈希桶的位置即索引值。我们都知道数组在获取元素会比链表快,所以我们应该尽量让每个哈希桶只有一个元素,这样在查询时就只需要通过索引值找到对应的哈希桶内的值,而不需要再通过桶内的链表一个一个去查。所以hash算法的作用是为了让元素分散均匀,从而提高查询效率。那接下来通过代码来一步一步分析时如何让元素分布均匀的。

//这是根据key值获取value值的方法
public V get(Object key) {Node<K,V> e;//先调用hash(key)return (e = getNode(hash(key), key)) == null ? null : e.value;
}

//Hash算法如下
static final int hash(Object key) {
int h;
//第一步:先获取key中的hashCode值
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
//第二步 再与hashcode向左移16位的值进行抑或
}
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 &&
//第三步 n是指数组长度,hash与(n-1)进行&与运算
(first = tab[(n - 1) & hash]) != null) {
//省略


}
return null;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

首先第一步获取hashcode没什么问题,到第二步为什么会跟hashcode左移16位的值进行抑或呢? 其实是将高位与低位进行与运算,减少碰撞机率。第三步取余运算,但在计算机运算中&肯定比%快,又因为h % n = h &(n - 1),所以最终将第二步得到的hash跟n-1进行与运算。n是table中的长度。

2、get方法,查询元素

查询get方法相对简单,只要明白hash算法后得到哈希桶的索引值,再对桶内的链表进行比较hash,key是否相等。下面是get方法中主要的代码

    final Node<K,V> getNode(int hash, Object key) {Node<K,V>[] tab; Node<K,V> first, e; int n; K k;//如果表为null或长度为0,或者经过hash算法后得到的哈希桶为null,则直接返回nullif ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) {//如果链表中的第一个节点元素相等则直接返回该Nodeif (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k))))return first;//第二个节点不为空时继续往后找if ((e = first.next) != null) {//判断是否为红黑树,是则交给红黑树去查找if (first instanceof TreeNode)return ((TreeNode<K,V>)first).getTreeNode(hash, key);//否则循环链表找到对应相等的元素,直到找到或下个节点为nulldo {if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))return e;} while ((e = e.next) != null);}}return null;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3.put方法,增加

put方法是重点也是最复杂的操作。需要掌握在什么情况下要扩容(后面会讲一下是如何扩容的),满足什么条件下链表需要转成红黑树。下面是put方法中流程图

    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;//table为null或length长度为0则扩容if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;//如果哈希桶为null,则创建节点放在该桶内if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);else {Node<K,V> e; K k;//如果桶内第一个元素hash相等,key相等,则更新此节点if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;//判断是否为红黑树,若是则调用红黑树的putTreeValelse if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {//循环链表for (int binCount = 0; ; ++binCount) {//知道下个节点为null时if ((e = p.next) == null) {//增加节点p.next = newNode(hash, key, value, null);//如果桶内的节点是否大于8if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st//这个方法里还会判断总节点数大于64则会转换为红黑树treeifyBin(tab, hash);break;}//如果找到相等的节点则退出循环if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}//只有找到相等节点是e不为nullif (e != null) { // existing mapping for key//更新节点为新的值V oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;//最后判断增加后的个数是否大于阈值,大于则扩容if (++size > threshold)resize();afterNodeInsertion(evict);return null;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

4.扩容

扩容是Hashmap重点中的重点。也是最耗性能的操作。扩容的步骤是先对size扩大两倍,再对原先的节点重新经过hash算法得到新的索引值即复制到新的哈希桶里。最后得到新的table。其中jdk8对扩容进行了优化,提高了扩容的效率。但在平常运用中尽量要避免让hashmap进行扩容,若已知hashmap中的元素数量,则一开始初始化hashmap时指定容量,这样就减少了hashmap扩容次数。

    final Node<K,V>[] resize() {Node<K,V>[] oldTab = table;int oldCap = (oldTab == null) ? 0 : oldTab.length;int oldThr = threshold;int newCap, newThr = 0;if (oldCap > 0) {//如果容量大于了最大容量时,直接返回旧的tableif (oldCap >= MAXIMUM_CAPACITY) {threshold = Integer.MAX_VALUE;return oldTab;}//同时满足扩容两倍后小于最大容量和原先容量大于默认初始化的容量,对阈值增大两倍else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&oldCap >= DEFAULT_INITIAL_CAPACITY)newThr = oldThr << 1; // double threshold}
    else if (oldThr &gt; 0) // initial capacity was placed in thresholdnewCap = oldThr;else {               // zero initial threshold signifies using defaults//默认初始化容量和阈值newCap = DEFAULT_INITIAL_CAPACITY;newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap &lt; MAXIMUM_CAPACITY &amp;&amp; ft &lt; (float)MAXIMUM_CAPACITY ?(int)ft : Integer.MAX_VALUE);}threshold = newThr;@SuppressWarnings({"rawtypes","unchecked"})Node&lt;K,V&gt;[] newTab = (Node&lt;K,V&gt;[])new Node[newCap];table = newTab;if (oldTab != null) {//接下来对哈希桶的所有节点转移到新的哈希桶中for (int j = 0; j &lt; oldCap; ++j) {Node&lt;K,V&gt; e;//如果哈希桶为null,则不需任何操作if ((e = oldTab[j]) != null) {//将桶内的第一个节点赋值给e//将原哈希桶置为null,让gc回收oldTab[j] = null;if (e.next == null)//如果e的下个节点(即第二个节点)为null,则只需要将e进行转移到新的哈希桶中newTab[e.hash &amp; (newCap - 1)] = e;else if (e instanceof TreeNode)//如果哈希桶内的节点为红黑树,则交给TreeNode进行转移((TreeNode&lt;K,V&gt;)e).split(this, newTab, j, oldCap);else { // preserve order//将桶内的转移到新的哈希桶内//JDK1.8后将新的节点插在最后面//下面就是1.8后的优化//1.7是将哈希桶的所有元素进行hash算法后转移到新的哈希桶中//而1.8后,则是利用哈希桶长度在扩容前后的区别,将桶内元素分为原先索引值和新的索引值(即原先索引值+原先容量)。这里不懂为什么,可以看下一段图文讲解。//loHead记录低位链表的头部节点//loTail是低位链表临时变量,记录上个节点并且让next指向当前节点Node&lt;K,V&gt; loHead = null, loTail = null;//hiHead,hiTail与上面的一样,区别在于这个是高位链表Node&lt;K,V&gt; hiHead = null, hiTail = null;Node&lt;K,V&gt; next;do {//用于临时记录当前节点的next节点next = e.next;//e.hash &amp; oldCap==0表示扩容前后对当前节点的索引值没有发生改变if ((e.hash &amp; oldCap) == 0) {//loTail为null时,代表低位桶内无元素则记录头节点if (loTail == null)loHead = e;else//将上个节点next指向当前节点//即新的节点是插在链表的后面loTail.next = e;//将当前节点赋值给loTailloTail = e;}else {//跟上面的步骤是一样的。if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}//当next节点为null则退出循环} while ((e = next) != null);//如果低位链表记录不为null,则低位链表放到原index中if (loTail != null) {//将最后一个节点的next属性赋值为nullloTail.next = null;newTab[j] = loHead;}//如果高位链表记录不为null,则高位链表放到新index中if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}return newTab;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104

1.8对扩容方法进行了优化,经过rehash之后,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。 看下图可以明白这句话的意思,n为table的长度,图(a)表示扩容前的key1和key2两种key确定索引位置的示例,图(b)表示扩容后key1和key2两种key确定索引
元素在重新计算hash之后,因为n变为2倍,那么n-1的mask范围在高位多1bit(红色),因此新的index就会发生这样的变化:

因此,我们在扩充HashMap的时候,不需要像JDK1.7的实现那样重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”,可以看看下图为16扩充为32的resize示意图:

这个设计确实非常的巧妙,既省去了重新计算hash值的时间,而且同时,由于新增的1bit是0还是1可以认为是随机的,因此resize的过程,均匀的把之前的冲突的节点分散到新的bucket了。这一块就是JDK1.8新增的优化点。有一点注意区别,JDK1.7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置,但是从上图可以看出,JDK1.8不会倒置
参考:resize方法详解
总结下通过分析代码后的一些心得

  • 运算尽量用位运算代替,比较高效。例如hash算法中的取模运算,用&n-1去替代%n方法,元素起来更加高效
  • 变量不用以后要赋值为null,让gc进行回收
  • 当桶内节点大于8和节点总数大于64时才会转换为红黑树,前者在putValue中验证,后者treeifyBin方法中判断
  • 扩容时,对容量进行扩大两倍后,原链表上的节点可能存放在原来的下表即low位。或者是存放在high位。high = low + oldCapacity

四、常见的面试题

1.HashMap底层是如何实现的?

首先底层数据结构是由数组+链表组成链表散列。HashMap先得到key的散列值,在通过扰动函数(减少碰撞次数)得到Hash值,接着通过hash & (n -1 ),n位table的长度,运算后得到数组的索引值。如果当前节点存在元素,则通过比较hash值和key值是否相等,相等则替换,不相等则通过拉链法查找元素,直到找到相等或者下个节点为null时。
1.8对扰动函数,扩容方法进行优化,并且增加了红黑树的数据结构。

2.HashMap 和 Hashtable 的区别

  • 线程安全 HashMap是线程不安全的,而HashTable是线程安全的,每个人方法通过修饰synchronized来控制线程安全。
  • 效率 HashMap比HashTable效率高,原因在于HashTable的方法通过synchronized修饰后,并发的效率会降低。
  • 允不允许null HashMap运行只有一个key为null,可以有多个null的value。而HashTable不允许key,value为null。

3.HashMap的长度为什么是2的倍数

在HashMap的操作流程中,首先会对key进行hash算法得到一个索引值,这个索引值就是对应哈希桶数组的索引。为了得到这个索引值必须对扰动后的数跟数组长度进行取余运算。即 hash % n (n为hashmap的长度),又因为&比%运算快。n如果为2的倍数,就可以将%转换为&,结果就是 hash & (n-1)。所以这就解释了为什么HashMap长度是2的倍数。

4.Jdk1.8中满足什么条件后将链表转化成红黑树?

很显然在putVal方法中是判断桶内的节点个数是否大于8,之后通过treeifyBin方法中判断长度是否大于最小红黑树容量64,小于则继续扩容,大于则转为红黑树。

//putVal方法判断桶内元素是是否大于8
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);
break;

//treeifyBin方法中判断长度是否大于最小红黑树容量64,小于则继续扩容,大于则转为红黑树
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
                                </div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet"><div class="more-toolbox"><div class="left-toolbox"><ul class="toolbox-list"><li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">点赞</span><span class="count">3</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打赏开始--><!--打赏结束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章举报</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/Yoga0301"><img src="https://profile.csdnimg.cn/4/8/C/3_yoga0301" class="avatar_pic" username="Yoga0301"><img src="https://g.csdnimg.cn/static/user-reg-year/2x/2.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/Yoga0301" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">Yoga0301</a></span></div><div class="text"><span>发布了29 篇原创文章</span> · <span>获赞 14</span> · <span>访问量 3万+</span></div></div><div class="right-message"><a href="https://im.csdn.net/im/main.html?userName=Yoga0301" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信</a><a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a></div></div></div>
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. xlsx插件,导入导出Excel (vue中导入导出表格)

    - ## vue文件中直接写函数,完成的测试 1). 安装xlsx, yarn add xlsx 2). importExcel.vue(实现了 导入表格 ) <template><div class="hello"><el-uploadclass="upload-demo" ref="upload" accept=".xls,.xlsx"act…...

    2024/3/29 6:50:01
  2. sipp basic call 脚本

    1 <?xml version="1.0" encoding="ISO-8859-1" ?>2 <!DOCTYPE scenario SYSTEM "sipp.dtd">3 4 <!-- This program is free software; you can redistribute it and/or -->5 <!-- modify it under the terms of the GNU…...

    2024/3/29 6:50:00
  3. linux awk命令详解

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息awk处理过程: 依次对每一行进行处理,然后输出awk命令形式:awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file[-F|-f|-v] 大参数,-F指定分隔…...

    2024/3/29 6:49:59
  4. python爬虫 \x00对网页解析的影响

    前两天在爬贴吧的时候,发现解析网页内容的时候无法获取部分元素。开始以为是动态网页,后发现当前页面包含我需要的数据,并非是靠js异步,在屏蔽js使用后发现通过模拟浏览器和保存到文本后都能解析到文本,唯独我直接把pq(rsp.text)无法获取到元素, 这就很有意思了。然后怀疑…...

    2024/5/4 14:06:38
  5. java虚拟机的监控以及诊断工具

    1. jps将打印所有正在运行的 Java 进程。2. jstat允许用户查看目标 Java 进程的类加载、即时编译以及垃圾回收相关的信息。它常用于检测垃圾回收问题以及内存泄漏问题。3. jmap允许用户统计目标 Java 进程的堆中存放的 Java 对象,并将它们导出成二进制文件。4. jinfo将打印目标…...

    2024/5/4 14:01:52
  6. Spring-手写Spring注解版本事务,Spring事物的七大传播行为

    一、注解 1、什么是内置注解(1) @SuppressWarnings 再程序前面加上可以在javac编译中去除警告--阶段是SOURCE (2) @Deprecated 带有标记的包,方法,字段说明其过时----阶段是SOURCE (3)@Overricle 打上这个标记说明该方法是将父类的方法重写--阶段是SOURCE1.1、@O…...

    2024/5/4 20:17:34
  7. 1088:分离整数的各个数

    1088:分离整数的各个数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 20785 通过数: 14837 【题目描述】 给定一个整数n(1≤n≤100000000),要求从个位开始分离出它的每一位数字。从个位开始按照从低位到高位的顺序依次输出每一位数字。 【输入】 输入一个整数,…...

    2024/3/29 14:06:42
  8. [十大算法JavaScript的实现] 五、BFPRT线性查找

    目录一、思想二、实现三、结果一、思想快速排序(https://www.yuque.com/docs/share/7f809e06-0724-49d9-b37d-41f3b4d32b85#)的扩展。取五分中位数位基准值,减少时间复杂度。二、实现js// k / n-k+1//找到list中第k大的数值let BFPRT = (idxList, k) => {// 找打五分位中…...

    2024/3/29 14:06:41
  9. 使用 vue-router,页面加载完成后,$route 的值不正确

    1 问题描述 页面加载时,需要判断:地址能否匹配上路由。如果匹配不上,就跳转到首页。 代码: mounted(){if (this.$route.matched.length === 0) {this.$router.push("/index");} }问题出现了:当访问的地址可以匹配上路由时,也会跳到首页。2 找到问题 在 mounted…...

    2024/4/6 18:47:20
  10. python爬虫 标签对网页内容解析的影响

    一 、 第一种是标签嵌套的情况,直接上图。如上图这种情况,直接使用 .xpath("//div/ul[@class=show]/text()")[0]是拿不到被<em></em>标签括在里面的内容的,如果单独获取em标签内容的话,拼接的字符串容易乱套,最好还是一次性拿到字符串。通过搜索引擎…...

    2024/5/2 8:18:08
  11. 常见的正则表达式

    正则表达式常见的有 \w \s \d \b. 匹配除了换行符以外的任意字符;\w 匹配字母或者数字或者下划线或者汉字 等价"[Aa-Zz0-9]"\s 匹配任意的空白符\d 匹配数字\b 匹配单词的开始或结束^ 匹配字符串的开始$ 匹配字符串的结束/-/g 匹配字符串中所有的"-…...

    2024/3/29 14:06:38
  12. 『Python』类型注解

    Python作为一种弱类型语言,由于不像Java、C++这些强类型一样,需要显示声明变量类型,所以在你写完代码后回头再看时,很容易出现看不懂的情况。同时,这种弱类型也会导致IDE的代码补全提示功能无法使用,因此Python引入了类型注解的功能,一定程度上缓解这种不足。下面是我总…...

    2024/3/29 14:06:38
  13. 【QT】QT实现添加右键菜单功能

    QT实现添加右键菜单功能目录1.添加头文件2.添加.h文件代码3.添加.cpp文件代码删除文件功能4.效果1.添加头文件#include <QContextMenuEvent> #include <QProcess> #include <QTableView> #include <QModelIndex>2.添加.h文件代码public:QTableView *tb…...

    2024/4/25 7:00:10
  14. awk如何取出它的每一行和某一列的某个元素

    我自己举例吧:NR==2,指定第二行,NR(Number of Record,记录数,awk中默认一行为一个记录)print $3,打印第三列最后输出第二行第三列的元素。=============================================================awk进行列求和【awk {a+= $0}END{print a}】:Partition ods.od…...

    2024/3/29 14:06:35
  15. JS获取下拉框自定义属性值等

    ...

    2024/3/29 14:06:35
  16. Linux-tree命令-树状结构打印目录

    tree命令-树状结构打印目录 1 简介 tree命令可以以树状结构打印目录。本文简要介绍其在mac上的安装和使用。 2 安装 brew install tree3 使用 3.1 最简单的例子 打印所有指定目录下的目录和文件(包括所有后代) $ tree chengc-demos/ chengc-demos/ ├── pom.xml └── src…...

    2024/4/24 8:43:36
  17. 对List中数据进行 条件筛选 去重 排序 大小写转换 排列拼接

    对List中数据进行 筛选 去重 排序 大小写转换 排列拼接代码展示: public static void main(String[] args) {List<String> list = Arrays.asList(str);String collect = list.stream().filter(i -> !isNum(i)).filter(i -> i.length() >= 16).map(i -> i.to…...

    2024/3/29 14:06:32
  18. jq 时间字符串分割成 时间格式

    代码 function dataS(dateString) {var dateStr = dateString.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5:$6");console.log(dateStr)return dateStr; } dataS("20190816191634");//2019-08-16 19:16:34...

    2024/4/1 0:55:31
  19. windows 安装 gitflow

    参考:https://www.cnblogs.com/smght/p/5519684.htmlGit flow是git的一个扩展集,它基于Vincent Driessen 的分支模型,可以用来简化代码的版本发布流程。下载getopt.exegetopt.exe的下载链接:http://downloads.sourceforge.net/gnuwin32/util-linux-ng-2.14.1-bin.zip解压,…...

    2024/3/29 6:50:11
  20. [十大算法JavaScript的实现] 四、二分查找

    目录一、场景二、现实意义三、思想四、实现五、结果一、场景在一个有序的数列中,选取一个数,判断是否为未知数(必定存在于该序列范围)并可以获取对比关系,快速找到未知数。二、现实意义"猜数字"游戏快速缩小数字范围三、思想二分法:每次取范围中间值与目标值进…...

    2024/5/4 20:14:58

最新文章

  1. Go Web 开发【Gin 框架快速开发】

    1、Gin Web 快速开发 1.1、环境准备 1.1.1、导入 gin 依赖 这里就叫 gin 依赖了&#xff0c;在 Goland 命令行中输入下面的命令&#xff1a; go get -u github.com/gin-gonic/gin 1.1.2、设置代理 如果下载失败&#xff0c;最好设置一下代理&#xff0c;在 cmd 命令行中输…...

    2024/5/4 20:44:30
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 【教程】iOS如何抓取HTTP和HTTPS数据包经验分享

    &#x1f4f1; 在日常的App开发和研发调研中&#xff0c;对各类App进行深入的研究分析时&#xff0c;我们需要借助专业的抓包应用来协助工作。本文将介绍如何使用iOS手机抓包工具来获取HTTP和HTTPS数据包&#xff0c;并推荐一款实用的抓包应用——克魔助手&#xff0c;希望能够…...

    2024/5/4 4:50:12
  4. Could not initialize class java.awt.Font

    项目场景&#xff1a; 项目场景&#xff1a;java项目在web端导出Excel、Word、PDF等文档 问题描述 在Windows系统中开发以及运行文件导出正常&#xff0c;单机部署到Linux中或者使用docker部署后&#xff0c;导出报错。 异常&#xff1a; eleasing transactional SqlSession…...

    2024/5/3 19:17:04
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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