五、深入理解JDK1.7中HashMap哈希冲突解决方案

2023-11-18

导读

前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析三、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。 四、深入理解Java中的HashMap「网易面试快答」文章中主要针对面试中常见的面试问题进行简单解答。
本篇文章我们将要对JDK1.7中HashMap的哈希冲突及减少哈希冲突的解决方案做详细的介绍,并通过源码加深大家的理解。

如果大家在面试中针对Java集合或者Java中的HashMap大家还有什么疑问或者其他问题,可以评论区告诉我。

简单介绍

JDK1.7—》哈希表,链表

JDK1.8—》哈希表,链表,红黑树— JDK1.8之后,当链表长度超过8使用红黑树。

非线程安全

0.75的负载因子,扩容必须为原来的两倍。

默认大小为16,传入的初始大小必须为2的幂次方的值,如果不为也会变为2的幂次方的值。

根据HashCode存储数据。

JDK1.7的哈希冲突解决方案

1.配置threshold:jdk.map.althashing.threshold(阀值-门槛)

配置改变hash冲突的门槛
源码:

/**

 * The default threshold of map capacity above which alternative hashing is

 * used for String keys. Alternative hashing reduces the incidence of

 * collisions due to weak hash code calculation for String keys.

 * <p/>

 * This value may be overridden by defining the system property

 * {@code jdk.map.althashing.threshold}. A property value of {@code 1}

 * forces alternative hashing to be used at all times whereas

 * {@code -1} value ensures that alternative hashing is never used.

 */

static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;
-Djdk.map.althashing.threshold = -1: 
		表示不做优化(不配置这个值作用一样)
-Djdk.map.althashing.threshold < 0: 
		报错

-Djdk.map.althashing.threshold = 1: 
		表示总是启用随机HashSeed
-Djdk.map.althashing.threshold >= 0 
		: 表示hashMap内部的数组长度超过该值了就使用随机HashSeed,
		降低碰撞

如果 配置该值为-1,表示不做hash冲突的优化;
如果 配置该值小于0,则报错;
如果 配置该值为1 则表示总是使用一个随机值(哈希因子hashseed)对hash冲突.
如果 配置该值大于等于0 表示当HashMap中数组长度超过该值的时候就使用随机值(哈希因子hashseed)来降低哈希冲突的可能性。

2.使用一个私有的静态内部类Holder加载虚拟机引导之后才被初始化的值。

使用私有的静态内部类Holder加载上一步配置的Jdk.map.althashing.threshold。
源码:

/**

 * The default threshold of map capacity above which alternative hashing is

 * used for String keys. Alternative hashing reduces the incidence of

 * collisions due to weak hash code calculation for String keys.

 * <p/>

 * This value may be overridden by defining the system property

 * {@code jdk.map.althashing.threshold}. A property value of {@code 1}

 * forces alternative hashing to be used at all times whereas

 * {@code -1} value ensures that alternative hashing is never used.

 */

static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;



/**

 * holds values which can't be initialized until after VM is booted.

 */

private static class Holder {



    /**

     * Table capacity above which to switch to use alternative hashing.

     */

    static final int ALTERNATIVE_HASHING_THRESHOLD;



    static {

        String altThreshold = java.security.AccessController.doPrivileged(

            new sun.security.action.GetPropertyAction(

                "jdk.map.althashing.threshold"));



        int threshold;

        try {

            threshold = (null != altThreshold)

                    ? Integer.parseInt(altThreshold)

                    : ALTERNATIVE_HASHING_THRESHOLD_DEFAULT;



            // disable alternative hashing if -1

            if (threshold == -1) {

                threshold = Integer.MAX_VALUE;

            }



            if (threshold < 0) {

                throw new IllegalArgumentException("value must be positive integer.");

            }

        } catch(IllegalArgumentException failed) {

            throw new Error("Illegal value for 'jdk.map.althashing.threshold'", failed);

        }



        ALTERNATIVE_HASHING_THRESHOLD = threshold;

    }

}



/**

 * A randomizing value associated with this instance that is applied to

 * hash code of keys to make hash collisions harder to find. If 0 then

 * alternative hashing is disabled.

 */

transient int hashSeed = 0;

源码解读:

1、static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;

如果在上一步中没有配置“jdk.map.althashing.threshold”,则使用该值表示是否对HashMap中的哈希冲突做干扰。该值的默认值是Integer的最大值。表示只有当HashMap中数组容量达到Integer的最大值时候才会做哈希冲突的干扰。设置这个值这么大,其实就是不做哈希冲突干扰。
2、在私有的静态内部类Holder中做判断判断。
①加载(jdk.map.althashing.threshold)配置的altThreshold;

String altThreshold = java.security.AccessController.doPrivileged(

    new sun.security.action.GetPropertyAction(

        "jdk.map.althashing.threshold"));

②如果从配置中加载到的altThreshold不为空,则把threshold赋值为加载到的altThreshold;

如果没有配置该altThreshold则使用默认的ALTERNATIVE_HASHING_THRESHOLD_DEFAULT,即Integer.MAX_VALUE;

threshold = (null != altThreshold)

        ? Integer.parseInt(altThreshold)

        : ALTERNATIVE_HASHING_THRESHOLD_DEFAULT;

③如果在JDK中配置的jdk.map.althashing.threshold为默认值-1,则把threshold设置为Integer.MAX_VALUE;

/ disable alternative hashing if -1

if (threshold == -1) {

    threshold = Integer.MAX_VALUE;

}

④.如果在JDK中配置的jdk.map.althashing.threshold值小于0,则报错,表示该值不是一个有效值。

if (threshold < 0) {

    throw new IllegalArgumentException("value must be positive integer.");

}

⑤.把经过计算的threshold的值赋值给“ALTERNATIVE_HASHING_THRESHOLD”.

也就是说最终是否对哈希冲突做干扰,或者在什么情况进行干扰是存储在“ALTERNATIVE_HASHING_THRESHOLD”中的。

ALTERNATIVE_HASHING_THRESHOLD = threshold;

⑥.解决哈希冲突的干扰因子。根据上一步中计算的配置“ALTERNATIVE_HASHING_THRESHOLD”判断是否启用该干扰因子。

/**

 * A randomizing value associated with this instance that is applied to

 * hash code of keys to make hash collisions harder to find. If 0 then

 * alternative hashing is disabled.

 */

transient int hashSeed = 0;

从代码看出jdk.map.althashing.threshold这个变量设置的值最终会存放在静态常量ALTERNATIVE_HASHING_THRESHOLD

3.根据初始化的HashMap容量大小,决定干扰因子的值。

源码:

/**
初始化哈希干扰的掩码值,我们把它的设置延迟到了真正使用它的时候。

 * Initialize the hashing mask value. We defer initialization until we

 * really need it.

 */

final boolean initHashSeedAsNeeded(int capacity) {
 
 
 
/**
判断是否开启了hash干扰。
如果hashseed 等于 0,则currentAltHashing = false;
如果hashseed 不等于 0 ,则currentAltHashing = true;
**/ 

    boolean currentAltHashing = hashSeed != 0;
/** 
判断是否使用为干扰
1.如果当前HashMap数组容量的大小等于jdk配置
    中“jdk.map.althashing.threshold”的值时候,
    且VM .isbooted 为true 时候,userAltHashing 为true;
2.如果当前HashMap数组容量的小于jdk配置
    中“jdk.map.althashing.threshold”的值时候,
    且VM .isbooted 为true 时候,userAltHashing 为false;
3. 如果当前HashMap数组容量的大小等于jdk配置
    中“jdk.map.althashing.threshold”的值时候,
    且VM .isbooted 为false 时候,userAltHashing 为false;
4. 如果当前HashMap数组容量的小于jdk配置
    中“jdk.map.althashing.threshold”的值时候,
    且VM .isbooted 为false 时候,userAltHashing 为false;
**/

    boolean useAltHashing = sun.misc.VM.isBooted() &&

            (capacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD);
/** 
对以上的两个值进行“异或”处理
异或的结果为 两个值相同为0,两个值不同为1.
也就是说 
currentAltHashing 为true时且useAltHashing也为true时,
或者 currentAltHashing 为false时且useAltHashing也为false时
switching的结果为 true.其他情况时候,switching为false.
**/

    boolean switching = currentAltHashing ^ useAltHashing;

    if (switching) {
/**
如果switching为true ,设置hashSeed(干扰因子)的值。
如果useAltHashing的值为true,则随机一个干扰值给HashSeed。否则赋值为0.
**/ 

        hashSeed = useAltHashing

            ? sun.misc.Hashing.randomHashSeed(this)

            : 0;

    }
//返回是否启用干扰因子

    return switching;

}

源码解读:

当hashMap扩大容量时,都是调用该方法。从代码可以看出,当数组容量超过,我们设定的值ALTERNATIVE_HASHING_THRESHOLD且是vm booted,同时 hashSeed==0的时候,hashSeed的值就是用随机量,而不是固定的等于0。这样就能降低碰撞,就能降低演化成链表概率。
代码具体过程:

当 hashSeed==0 则 currentAltHashing=false
当 capacity < Holder.ALTERNATIVE_HASHING_THRESHOLD 则currentAltHashing =false
结果:
switching=false
 
当 hashSeed==0 则 currentAltHashing=false
当 capacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD  则 currentAltHashing =true
结果:
switching=true
 
 
当 hashSeed !=0 则 currentAltHashing=true
当 capacity < Holder.ALTERNATIVE_HASHING_THRESHOLD  则 currentAltHashing =false
结果:
当 switching=true
 
当 hashSeed !=0 则 currentAltHashing=true
当 capacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD  则 currentAltHashing =true
结果:
switching=false

回头再看代码,发现很巧妙

结论:

①.如果不配置“jdk.map.althashing.threshold”,则HashMap中的私有静态内部类中的’ALTERNATIVE_HASHING_THRESHOLD‘的值为Integer.MAX_VALUE,且HashSeed默认值为0,则switching的值永远为false,也就永远不会改变干扰因子(HashSeed)的值。

②.如果配置了“jdk.map.althashing.threshold”,则会根据当前HashMap中的数组容量动态的变更HashSeed的值,以便于引入HashSeed降低哈希冲突。

-Djdk.map.althashing.threshold=-1:表示不做优化(不配置这个值作用一样)

-Djdk.map.althashing.threshold<0:报错

-Djdk.map.althashing.threshold=1:表示总是启用随机HashSeed

-Djdk.map.althashing.threshold>=0:便是hashMap内部的数组长度超过该值了就使用随机HashSeed,降低碰撞

4.获取key的Hash值,位干扰。

源码:

/**

 * Retrieve object hash code and applies a supplemental hash function to the

 * result hash, which defends against poor quality hash functions.  This is

 * critical because HashMap uses power-of-two length hash tables, that

 * otherwise encounter collisions for hashCodes that do not differ

 * in lower bits. Note: Null keys always map to hash 0, thus index 0.

 */

final int hash(Object k) {
/** 
获取哈希干扰因子,该因子会跟根据HashMap的容量进行变更
变更情况根据上一步的“final boolean initHashSeedAsNeeded(int capacity)
”方法动态变更
**/ 

    int h = hashSeed;
//如果为干扰因子不为0,且传入的key类型为String,则使用特定的算法(sun.misc.Hashing.stringHash32((String) k))对该key进行hash计算。并返回

    if (0 != h && k instanceof String) {

        return sun.misc.Hashing.stringHash32((String) k);

    }

//如果哈希干扰因子为0 或者 k的类型不为String则使用异或操作变更key的hashcode

    h ^= k.hashCode();

//为了减少Hash冲突出现次数进行必要的位干扰,默认负载因子是8.

    // This function ensures that hashCodes that differ only by

    // constant multiples at each bit position have a bounded

    // number of collisions (approximately 8 at default load factor).

    h ^= (h >>> 20) ^ (h >>> 12);

    return h ^ (h >>> 7) ^ (h >>> 4);

}

源码解读:

可以看出生成的hash值和hashSeed 这个值有着紧密的关系,但是这个值默认是0。也就是说不管HashMap存多少数据,hashSeed 都是不会变的,可以看出随着hashMap 的容量增大,hash碰撞的概率增大的可能性也就增大。如果hash值,碰撞很高的话,那么hashMap逐渐演化成链表,性能就急剧下降。

在hash(Object k)中有这么一段位运算的代码:

h ^= k.hashCode();
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);

看起来既简单又深奥的样子,让我们来看看这段代码隐藏的东西吧。

k.hashCode()函数调用的是key键值类型自带的哈希函数,由于不同的对象其hashCode()有可能相同,所以需对hashCode()再次哈希,以降低相同率。

接下来的一串与运算和异或运算,称之为“扰动函数”,扰动的核心思想在于使计算出来的值在保留原有相关特性的基础上,增加其值的不确定性,从而降低冲突的概率。不同的版本实现的方式不一样,但其根本思想是一致的。这里的具体实现方式是如何保证的呢?笔者功力浅薄,暂时还没有答案,如果有朋友知道的话可以交流。但是,“扰动函数”的核心思想一定要明白。

针对Java集合或者Java中的HashMap大家还有什么疑问或者其他问题,可以评论区告诉我。

往期文章链接

Java集合

一、深入理解-Java集合初篇

二、Jdk1.7和1.8中HashMap数据结构及源码分析

三、JDK1.7和1.8HashMap数据结构及源码分析-续

四、深入理解Java中的HashMap「网易面试快答」
Java-IO体系

一、C10K问题经典问答
二、java.nio.ByteBuffer用法小结
三、Channel 通道
四、Selector选择器
五、Centos-Linux安装nc
六、windows环境下netcat的安装及使用
七、IDEA的maven项目的netty包的导入(其他jar同)
八、JAVA IO/NIO
九、网络IO原理-创建ServerSocket的过程
十、网络IO原理-彻底弄懂IO
十一、JAVA中ServerSocket调用Linux系统内核
十二、IO进化过程之BIO
十三、Java-IO进化过程之NIO
十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型
十五、使用Selector(多路复用器)实现Netty中Reactor主从模型
十六、Netty入门服务端代码
十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)

如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒

Java集合还需要学习的内容

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

五、深入理解JDK1.7中HashMap哈希冲突解决方案 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • 【Python 3.7】访客名单:编写一个 while 循环,提示用户输入其名字。用户输入其名字后, 在屏幕上打印一句问候语,并将一条访问记录添加到文件 guest_book.txt 中。

    Python 3 7 访客名单 编写一个 while 循环 提示用户输入其名字 用户输入其名字后 在屏幕上打印一句问候语 并将一条访问记录添加到文件 guest book txt 中 确保这个文件中的每条记录都独占一行 程序为 filena
  • Python实现GWO智能灰狼优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 视频讲解 如需数据 代码 文档 视频讲解可以直接到文章最后获取 1 项目背景 灰狼优化算法 GWO 由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化
  • HLS图像处理系列——肤色检测

    本博文采用Xilinx HLS 2014 4工具 实现一个肤色检测的模块 其中 本文重点是构建HLS图像处理函数 新建HLS工程的步骤 本博文不再详述 本工程新建之后 只添加了五个文件 如下图所示 其中 top cpp中的主函数最终会综合生
  • 全球公有云一哥AWS十年宕机故障大全

    任何一个公有云供应商 在发展的历史长河中 都遭遇了这样那样的宕机 故障 或因人为因素 或因雷电太凶 或因机房停电 或因光缆被挖 或因代码错输 这些问题的出现与解决 正好也是公有云服务不断优化与提升的过程 不过 作为全球公有云的一哥 从可以查
  • Windows10下安装MXNet-走过的那些坑

    一 一开始看到各种安装方法 简单的 用pip安装mxnet的python CPU版本和GPU版本 windows还是linux python2还是python3 安装命令都一样 用pip安装mxnet的python CPU版本 pip in
  • 数据库CPU满载如何处理

    当数据库CPU满载时 我们首先要做的是让CPU降下来 优先保证系统的可用性 什么情况会导致数据库CPU飙升呢 QPS过高 高并发 也就是数据库承载的流量过大 慢SQL 少量或大量慢SQL占用CPU资源 拖垮了数据库 这类慢sql通常表现为
  • 第3章 ChatGPT简介

    3 1ChatGPT厚积薄发 最近 工智能公司OpenAI推出的ChatGPT风靡全球 其上线仅两个月 注册用户破亿 ChatGPT包含丰富的知识 不仅能更好地理解人类的问题和指令 流畅进行多轮对话 还在越来越多领域显示出解决各种通用问题和
  • DNS server列表整理

    收集DNS服务器的意义不在于能越过GFW 而是在当前DNS污染越发严整的环境下 能够找到一个比较好的DNS server以便提供优质的github和onedrive 或microsoft相关软件 访问体验 这一篇会持续更新 并且根据日常体验
  • 详解通往Web3的护照:去中心化身份DID

    介绍 互联网的创建没有为人们提供本地身份验证层 由此 数字身份问题被纳入网站和应用程序范畴 这种方法可能适用于互联网的早期阶段 但现在线上有数十亿人 但缺点正变得越来越明显 用户名和密码仍占主导地位 尽管这被反复证明是不安全的模型 普通人必
  • 安卓各个平台适配

    标题安卓各个平台适配 一 安卓6 0适配 1 targetSdkVersion Android 6 0 API 级别 23 2 相关API 3 简单的例子 4 封装库 二 安卓7 0适配 1 使用FileProvider 1 manifes
  • httpip工具实践

    应用场景 jenkins在发布完成后需要请求一个接口验证数据 如果是正确的返回相应数据 采用传统的curl没有色差输出 不方便阅读 使用http命令结果会有色彩输出 方便阅读 安装方法 官网地址https httpie org CentOS
  • Docker在云平台上的最佳实践:基于容器技术的DevOps探索

    12月9日 在云栖计算之旅线下沙龙上 阿里云容器服务团队的高级研发工程师秦妤嘉分享了 基于容器技术的DevOps探索 首先介绍了DevOps和CD 接着分析了Docker如何打破传统CD壁垒 最后讲解了怎样从零开始搭建一个持续交付系统 视频
  • 华为OD机试真题- 对称字符串【2023Q2】【JAVA、Python、C++】

    题目描述 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第 4 个字符串 BRRBRBBR 第 5 个字符串 RBBRBRRBBRRBRBBR 相信你已经发
  • 《高效能程序员的修炼》之译者序

    出版社的冀康一开始来找我谈翻译这本书的时候 我的第一反应是 这兄弟真是不知道我现在有多忙 我每天要处理200多封邮件 在资源有限的情况下经常要同时带6 7个项目 而且每个项目的交付计划都很紧 压力很大 每天起码工作12个小时 有时候还要熬夜
  • python连续输入多行_python-遍历Pandas DataFrame并插入行的最快方法

    我正在构建一个工具 以帮助您每周自动执行来自多个实验室设置的数据审查 每天都会生成一个制表符分隔的文本文件 每行代表每2秒获取的数据 因此共有43200行和许多列 每个文件为75mb 我正在使用pandas readcsv加载七个文本文件
  • Python基础知识笔试

    Python基础知识笔试 单选题 2 5分 20题 1 下列哪个表达式在Python中是非法的 B A x y z 1 B x y z 1 C x y y x D x y 2 python my py v1 v2 命令运行脚本 通过 fro
  • JavaScript 基础

    JavaScript 基础 JavaScript 是一门编程语言 可为网站添加交互功能 例如 游戏 动态样式 动画以及在按下按钮或收到表单数据时做出的响应等 本文介绍了 JavaScript 的精彩之处和主要用途 JavaScript 到底
  • Python中的列表和元组

    Python中的列表和元组 1 列表和元组 2 Python 中的列表和元组都支持负数索引 3 列表和元组都支持切片操作 4 列表和元组都可以随意嵌套 5 两者也可以通过 list 和 tuple 函数相互转换 6 列表和元组常用的内置函数
  • easyexcel和poi对比_POI 和 EasyExcel

    POI 和 easyExcel 讲解 转自狂神老师 仅作为个人笔记使用 一 POI 常用进程 1 将用户信息导出为excel表格 导出数据 2 将Excel表中的信息录入到网站数据库 习题上传 开发中经常会设计到excel的处理 如导出Ex
  • 五、深入理解JDK1.7中HashMap哈希冲突解决方案

    导读 前面文章一 深入理解 Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍 上两篇文章二 Jdk1 7和1 8中HashMap数据结构及源码分析 三 JDK1 7和1 8HashMap数据结构及源码分析 续 中我们分别对