源码

集合框架系列 Map(十):HashMap

柔情痞子 提交于 2020-03-18 18:17:13
目录 1 概述 2 原理 3 源码分析  3.1 构造方法   3.1.1 构造方法分析   3.1.2 初始容量、负载因子、阈值  3.2 查找  3.3 遍历  3.4 插入   3.4.1 插入逻辑分析   3.4.2 扩容机制   3.4.3 链表树化、红黑树链化与拆分  3.5 删除  3.6 其他细节  3.7 总结 1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap 。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是非线程安全类,在多线程环境下可能会存在问题。 在本篇文章中,我将会对 HashMap 中常用方法、重要属性及相关方法进行分析。需要说明的是,HashMap 源码中可分析的点很多,本文很难一一覆盖,请见谅。 2. 原理 上一节说到 HashMap 底层是基于散列算法实现,散列算法分为散列再探测和拉链式。HashMap 则使用了拉链式的散列算法,并在 JDK 1.8 中引入了红黑树优化过长的链表。数据结构示意图如下: 对于拉链式的散列算法,其数据结构是由数组和链表(或树形结构)组成

Nginx平滑升级源码分析

大城市里の小女人 提交于 2020-03-18 14:48:15
一、平滑升级步骤 1、重命名之前的sbin/nginx文件,将新的nginx文件放到sbin/目录下 #mv ./sbin/nginx ./sbin/nginx.old #cp ~/nginx ./sbin/ 2、向正在运行的nginx发送USR2信号启动新的nginx,这个时候新老nginx都会接收请求,看那一个进程能抢到锁,抢到锁的worker进程可以accpet新请求 #kill -USR2 `cat nginx.pid` 3、观察新的nginx运行无误后,向旧nginx发信号 停止旧nginx的运行 #kill -QUIT `cat nginx.pid.oldbin` 二、源码分析 1,nginx启动时 设置信号监听函数,监听信号 src/core/nginx.c 368行 ngx_init_signals函数 设置要监听的信号,和信号的处理函数 src/core/nginx.c 291-293行 信号为sig->signo,对应的处理函数为sig->handler sig的定义如下 QUIT和USR2的信号处理函数都为 ngx_signal_handler 对应的流程图为 2、master进程通过sigsuspend挂起在信号监听处 3,向master进程id发送USR2信号 ngx_signal_handler处理USR2信号 src/os/unix/ngx

读jQuery源码 - Deferred

烂漫一生 提交于 2020-03-18 11:13:47
Deferred 首次出现在 jQuery 1.5 中,在 jQuery 1.8 之后被改写,它的出现抹平了javascript中的大量回调产生的金字塔,提供了异步编程的能力,它主要服役于 jQuery.ajax 。 Deferred 就是让一组函数在合适的时机执行,在成功时候执行成功的函数系列,在失败的时候执行失败的函数系列,这就是 Deferred 的本质。简单的说,模型上可以规划为两个数组来承接不同状态的函数——数组 resolve 里的函数列表在成功状态下触发, reject 中的函数在失败状态下触发。 本文原创于 linkFly , 原文地址 。 这篇文章主要分为以下知识,和上一篇博文《 读jQuery源码之 - Callbacks 》关联。 什么是Deferred jQuery.Deferred的Promise Deferred的模型与工作原理 jQuery.Deferred的实现 jQuery.Deferred的then() 什么是Deferred 初窥Deferred Deferred本身就是承接一组函数,在异步中执行这组函数,过去的我们是这样编写异步代码的: var resolve = function () { console.log('成功'); }, //定义一个失败状态下运行的函数 reject = function () { console.log(

死磕 java线程系列之线程模型

北慕城南 提交于 2020-03-18 07:24:11
问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“ 用户线程 ”,而对应到操作系统,还有另外一种线程叫作“ 内核线程 ”。 用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。 最终,用户线程和内核线程之间必然存在某种关系,本章我们一起来学习下建立这种关系常见的三种方法:多对一模型、一对一模型和多对多模型。 多对一模型 多对一线程模型,又叫作用户级线程模型,即多个用户线程对应到同一个内核线程上,线程的创建、调度、同步的所有细节全部由进程的用户空间线程库来处理。 优点: 用户线程的很多操作对内核来说都是透明的,不需要用户态和内核态的频繁切换,使线程的创建、调度、同步等非常快; 缺点: 由于多个用户线程对应到同一个内核线程,如果其中一个用户线程阻塞,那么该其他用户线程也无法执行; 内核并不知道用户态有哪些线程,无法像内核线程一样实现较完整的调度、优先级等; 许多语言实现的协程库基本上都属于这种方式,比如python的gevent。 一对一模型 一对一模型,又叫作内核级线程模型

开源unittest测试报告源码BSTestRunner.py

。_饼干妹妹 提交于 2020-03-18 05:10:55
开源BSTestRunner 生成HTML测试报告源码: 保存代码到BSTestRunner.py 配合Unittest使用,很完美。 python2: """ A TestRunner for use with the Python unit testing framework. It generates a HTML report to show the result at a glance. The simplest way to use this is to invoke its main method. E.g. import unittest import BSTestRunner ... define your tests ... if __name__ == '__main__': BSTestRunner.main() For more customization options, instantiates a BSTestRunner object. BSTestRunner is a counterpart to unittest's TextTestRunner. E.g. # output to a file fp = file('my_report.html', 'wb') runner = BSTestRunner.BSTestRunner(

【原创】jQuery1.8.2源码解析之jQuery.data

北城余情 提交于 2020-03-18 02:07:51
数据缓存,jQuery现在支持两种: 1. dom元素,数据存储在jQuery.cache中。 2.普通js对象,数据存储在该对象中。 以下是源代码: 1 var rbrace = /^(?:\{.*\}|\[.*\])$/, 2 rmultiDash = /([A-Z])/g; 3 4 // 首先是对jQuery对象自身的扩展 5 jQuery.extend({ 6 // 即jQuery.cache,负责存储dom元素的缓存数据 7 cache: {}, 8 9 // removeData时,缓存的数据被清除,返回的当时对应的id,以便再利用 10 deletedIds: [], 11 12 // Please use with caution 13 // 将数据存储到jQuery.cache中时,需要唯一id,用它来维护 14 uuid: 0, 15 16 // Unique for each copy of jQuery on the page 17 // Non-digits removed to match rinlinejQuery 18 // 内部key(随即生成),之后会作为key添加到dom的属性集中,而key对应的value则是该dom对应的缓存对象 19 expando: "jQuery" + ( jQuery.fn.jquery + Math.random(

HashMap底层源码剖析

十年热恋 提交于 2020-03-17 19:17:23
HashMap底层源码剖析 数组+单向链表+红黑树 数组:    数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:    当法神hash碰撞时,首先会找到数组对应位置,然后1.8采用尾插入法(1.7采用头插入法),形成一个单项链表结构 红黑树:   当数组中每项的链表长度大于8时,会转换为红黑树 什么是hash碰撞?解决方案 hash碰撞:    不同的key可能会产生相同的hash值; 方案:    链表发,再哈希法; hashMap中采用链表发,在ConcurrentHashMap中采用哈希法; 为什么采用红黑树,比如二叉查找树,并且为什么临界值为8    二叉查找树在特殊情况下也会变为线性结构,和原来链表有共同的问题,节点太深,查找性能慢 使用红黑树主要用于提升查询速度,红黑树是平衡二叉树的一种,插入新的数据都会通过左旋,右旋,变色等操作来保持平衡,解决节点的深度问题   当数据较少时,采用链表要比红黑树效率高,因为平衡二叉树保持平衡需要耗费资源,那么前期数据较少时采用链表,当数据到达一定的界限后,再采用 红黑树,可以加快数据查询速度,官方测试8为性能最优 put()底层源码剖析 public V put(K key, V value) { return putVal(hash(key), key, value, false, true);     } /**

centos8 安装 nodejs (源码编译nodejs)

我的梦境 提交于 2020-03-17 19:13:30
centos8 安装 nodejs (源码编译nodejs) 1.安装必要的编译软件包 yum -y install gcc gcc-c++ 2.下载源码nodejs wget https://npm.taobao.org/mirrors/node/v10.13.0/node-v10.13.0.tar.gz 3.解压 tar xvf node-v10.13.0.tar.gz 4.编译安装 cd node-v10.13.0 ./configure && make && make install 5.验证 node -v 来源: CSDN 作者: hflxhn.com 链接: https://blog.csdn.net/weixin_42500714/article/details/104829119

HashMap底层源码与实现逻辑

依然范特西╮ 提交于 2020-03-17 19:02:20
ConcurrentHashMap性能高于HashTable,都能够完成线程安全操作, Hashtable中线程安全使用synchronized同步方法进行加锁操作,如果当前一个线程正在访问该集合,其他线程是无法进行访问的,需要进行等待 反之ConcurrentHashMap当中采用分段锁机制 JDK1.7和JDK1.8底层实现的区别 JDK1.8版本之前,ConcurrentHashMap使用分段锁技术,将数据分成一段一段的进行村粗,每一个数据段配置一把锁Segment(继承ReentrantLock) 底层采用:Segment+HashEntry 当数据添加时,根据key值找到Segment对应的数据段,然后匹配数据块,采用链表方式进行存储 1.1JDK1.7底层实现 在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成: Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样 1.2JDK1.8底层实现 JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现

Mybatis源码学习:整体框架理解

做~自己de王妃 提交于 2020-03-17 10:41:35
某厂面试归来,发现自己落伍了!>>> 一、对源码先上一个结构图: 源代码主要在org.apache.ibatis目录下,18个包,其中在应用中主要的包有:builder、session、cache、type、transaction、datasource、jdbc、mapping,提供支撑服务的包有annotation、binding、io、logging、plugin、reflection、scripting、exception、executor、parsing 二、从使用入手 MyBatis使用的三板斧是SqlSessionFactoryBuilder和SqlSessionFactory、SqlSession SqlSessionFactoryBuilder 支持9种构造方法,其实最主要的是包含Configuration对象的构造方法,目的是为了通过加载配置文件创造SqlSessionFactory对象,真实最终返回的是DefaultSqlSessionFactory对象 所有的构造方法最终都是调用build(Configuratiron)方法,这就要来研究一下Configuration对象,其实他就是对xml配置文件的对象映射,关于xml文件结构组成可从源码中看出如下: 本文介绍一下Configuration的大框架,后续开个专辑专门研究Configuration的细节 ? 1