首页
学习
活动
专区
圈层
工具
发布

如何在 IIS 上搭建 mercurial server

mercurial server 对于代码管理工具,更多的人可能更熟悉 Git 一些(Git 太火了)。其实另外一款分布式代码管理工具也被广泛的使用,它就是 mercurial。...关于创建 mercurial server 的步骤,mercurial 官方的 wiki 有说明,网上也有很多朋友分享了自己的创建过程。...这就 OK 了,让我们在 c:\repos 目录下初始化一个库然后访问 http://localhost:81/hgweb.cgi 看看: ?...六、设置匿名访问权限 默认情况下我们已经可以使用匿名权限从服务器克隆库并进行操作了,但是当你执行 hg push 命令时会收到一个 HTTP Error 502: Bad Gateway 的错误。...出现这个错误,是因为匿名用户没有修改服务器上文件的权限,所以我们需要给匿名身份验证设置一个有修改文件权限的用户。 ? 现在就可以正常执行 push 操作了。

2.2K70

66.Java容器面试题:谈谈你对 HashMap 的理解

在第一次添加操作中,HashMap 会先判断存储数组有没有初始化,如果没有先进行初始化操作,初始化过程中会取比用户指定的容量大的最近的2 的幂次方数作为数组的初始容量,并更新扩容的阈值。...添加操作的执行流程为: 先判断有没有初始化 再判断传入的key 是否为空,为空保存在table[o] 位置 key 不为空就对key 进hash,hash 的结果再& 数组的长度就得到存储的位置 如果存储位置为空则创建节点...HashMap1.7 的问题还有1.7 和1.8 的差别。...解决并发问题可以采用 Java 类库提供的Collections 工具包下的Collections.synchronizedMap()方法,返回一个线程安全的Map 或者使用并发包下的 ConcurrentHashMap...,ConcurrentHashMap采用分段锁机制实现线程安全 使用HashTable (不推荐) Hash1.7 和1.8 最大的不同在于1.8 采用了“数组+链表+红黑树”的数据结构,在链表长度超过

16310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【66期】Java容器面试题:谈谈你对 HashMap 的理解

    在第一次添加操作中,HashMap 会先判断存储数组有没有初始化,如果没有先进行初始化操作,初始化过程中会取比用户指定的容量大的最近的2 的幂次方数作为数组的初始容量,并更新扩容的阈值。...添加操作的执行流程为: 先判断有没有初始化 再判断传入的key 是否为空,为空保存在table[o] 位置 key 不为空就对key 进hash,hash 的结果再& 数组的长度就得到存储的位置 如果存储位置为空则创建节点...HashMap1.7 的问题还有1.7 和1.8 的差别。...解决并发问题可以采用 Java 类库提供的Collections 工具包下的Collections.synchronizedMap()方法,返回一个线程安全的Map 或者使用并发包下的 ConcurrentHashMap...,ConcurrentHashMap采用分段锁机制实现线程安全 使用HashTable (不推荐) Hash1.7 和1.8 最大的不同在于1.8 采用了“数组+链表+红黑树”的数据结构,在链表长度超过

    71820

    HashMap连环18问

    JDK1.7 HashMap结构 JDK1.8 HashMap结构 更深入的面试问题, 为什么在解决 hash 冲突的时候,不直接用红黑树?而选择先用链表,再转红黑树?...我们来看下详细过程,以JDK1.8为例,n为table的长度: 扩展出以下几个问题, JDK1.8 为什么要 hashcode 异或其右移十六位的值?...简要流程如下: 首先根据 key 的值计算 hash 值,找到该元素在数组中存储的下标; 如果数组是空的,则调用 resize 进行初始化; 如果没有哈希冲突直接放在对应的数组下标里; 如果冲突了,且...区别在两处: 解决哈希冲突时,JDK1.7 只使用链表,JDK1.8 使用链表+红黑树,当满足一定条件,链表会转换为红黑树。...因为字符串是不可变的,所以在它创建的时候 hashcode 就被缓存了,不需要重新计算。这就是 HashMap 中的键往往都使用字符串的原因。

    81720

    【 java 集合知识 第二篇 】

    3.为空,添加键值对 4.不为空,通过链表来链接在一个哈希桶中 HashMap在jdk1.8之后底层采用数组加链表或红黑树的数据结构,然后就是添加判断,数组槽位为空会在槽位中创建一个Node对象存入要添加的键值对和...(长度为旧数组的两倍),当然如果没有满足实际扩容要求,还是需要继续2倍,直到满足长度后,创建一个新数组,将旧数组的对象遍历(entry或node),取出哈希值,jdk1.7采用重新再哈希,当然分布更均匀...在jdk1.7,在多线程背景下会出现Entry链死循环和数据丢失问题 在jdk1.8,解决了Entry死循环和数据丢失问题,但是在多线程背景下出现了新的问题put方法数据覆盖问题 分析:为什么jdk1.7...方法一:链接法 使用链表或其他的数据结构存储冲突的键值对,链接到一个哈希桶中 方法二:开放寻址法 在哈希表中找另外一个可以存储的地方进行存储键值对,常见的方法:线性探测,二次探测,双重散列....满足,对数据进行扩容 --- 12.不满足,结束 1.7.HashMap的key使用什么类型 使用String类型,因为String类型不可变,每次修改都是创建一个新的对象,那么就保证的key

    23510

    HashMap 相关面试集合(2022)

    也就是说 HashMap 总是使⽤ 2 的幂作为哈希表的⼤⼩,后⾯会介绍到为什么是 2 的幂次⽅。 5....Jdk1.7到Jdk1.8 HashMap 发⽣了什么变化(底层)?...1.7中底层是数组+链表,1.8中底层是数组+链表+红⿊树,加红⿊树的⽬的是提⾼HashMap插⼊和 查询整体效率 1.7中链表插⼊使⽤的是头插法,1.8中链表插⼊使⽤的是尾插法,因为1.8中插⼊key...和value时需要 判断链表元素个数,所以需要遍历链表统计链表元素个数,所以正好就直接使⽤尾插法 1.7中哈希算法⽐较复杂,存在各种右移与异或运算,1.8中进⾏了简化,因为复杂的哈希算法的⽬的 就是提⾼...底层数据结构: JDK1.7 的 ConcurrentHashMap 底层采⽤ 分段的数组+链表 实现,JDK1.8采⽤的数据结构跟 HashMap1.8 的结构⼀样,数组+链表/红⿊⼆叉树。

    22210

    VSCode | 那些让你眼前一亮的插件

    您可以定义自己的项目(也称为收藏夹),或选择自动检测Git、Mercurial或SVN存储库、VSCode文件夹或任何其他文件夹 下面是Project Manager提供的一些特性: 将任何文件夹或工作区保存为项目...自动检测Git, Mercurial或SVN存储库 使用标签组织项目 在相同的或新的窗口中打开项目 识别已删除/重命名的项目 标识当前项目的状态栏 draw.io 这个非官方的扩展绘制矢量图软件,这也是木荣本人一直在使用的软件...要创建一个新的图表,只需创建一个空的*.Drawio,*.Drawio.svg或*.Drawio.png文件并打开。 .draw.svg是有效的.svg文件,可以嵌入到Github自述文件!...在VSCode中列出和浏览项目。 使用编辑器内的注释从VSCode中审查项目。 在VSCode中验证项目,轻松检出。 终端集成,使UI和cli共存。 在VSCode中列出和浏览问题。...悬浮卡片“@”提到的用户和问题。 对用户和问题的完成建议。 “开始处理问题”操作,可以为您创建一个分支。 编写操作代码,从“todo”注释中创建问题。

    1.2K30

    面试:HashMap 夺命二十一问!你都能 回答出来吗?

    18.针对 ConcurrentHashMap 锁机制具体分析(JDK 1.7 VS JDK 1.8) 19.ConcurrentHashMap 在 JDK 1.8 中,为什么要使用内置锁 synchronized...(JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)(注意:当碰撞导致链表大于 TREEIFY_THRESHOLD = 8 时,就把链表转换成红黑树) 获取对象时,将 K 传给 get() 方法...8.数组扩容的过程? 创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。...HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁); 而针对 ConcurrentHashMap,在 JDK 1.7 中采用 分段锁的方式;JDK 1.8 中直接采用了...18.针对 ConcurrentHashMap 锁机制具体分析(JDK 1.7 VS JDK 1.8) JDK 1.7 中,采用分段锁的机制,实现并发的更新操作,底层采用数组+链表的存储结构,包括两个核心静态内部类

    86200

    Java8内存结构的改变~

    注意,这里我指定了堆内存的大小为16M,所以这个地方显示的count=14(这个数字不是固定的),至于为什么会是14或其他数字,需要根据 GC 日志来判断,具体原因会在下篇文章中给大家解释。...我们现在通过动态生成类来模拟 “PermGen space”的内存溢出: ? ? 运行结果如下: ? 本例中使用的 JDK 版本是 1.7,指定的 PermGen 区的大小为 8M。...这里之所以采用 JDK 1.7,是因为在 JDK 1.8 中, HotSpot 已经没有 “PermGen space”这个区间了,取而代之是一个叫做 Metaspace(元空间) 的东西。...JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。...我们通过 JDK 1.6、JDK 1.7 和 JDK 1.8 分别运行: JDK 1.6 的运行结果: ? JDK 1.7的运行结果: ? JDK 1.8的运行结果: ?

    1.3K20

    HashMap常见面试题_java面试题大汇总

    JDK1.8中,是通过hashCode()的高16位异或低16位实现的:(h=k.hashCode())^(h>>>16),主要是从速度,功效和质量来考虑的,减少系统的开销,也不会造成因为高位没有参与下标的计算...8.数组扩容的过程? 创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。...数组+链表改成了数组+链表或红黑树 链表的插入方式从头插法改成了尾插法 扩容的时候1.7需要对原数组中的元素进行重新hash定位在新数组的位置,1.8采用更简单的判断逻辑,位置不变或索引+旧容量大小;...在插入时,1.7先判断是否需要扩容,再插入,1.8先进行插入,插入完成再判断是否需要扩容; HashMap线程安全方面会出现什么问题 在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。...hashMap是线程不安全的,其主要体现: 1.在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。 2.在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。

    56920

    (1)美团面试题:Hashmap的结构,1.7和1.8有哪些区别,史上最深入的分析「建议收藏」

    (一) 真实面试题之:Hashmap的结构,1.7和1.8有哪些区别 不同点: (1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?...那么就会造成一次无效扩容,但是在1.8的时候是先插入再扩容的,优点其实是因为为了减少这一次无效的扩容,原因就是如果这次插入没有发生Hash冲突的话,那么其实就不会造成扩容,但是在1.7的时候就会急造成扩容...(4)而在JDK1.8的时候直接用了JDK1.7的时候计算的规律,也就是扩容前的原始位置+扩容的大小值=JDK1.8的计算方式,而不再是JDK1.7的那种异或的方法。...,JDK1.7用了9次扰动处理=4次位运算+5次异或,而JDK1.8只用了2次扰动处理=1次位运算+1次异或。...这里在重新进行补充两个问题:(2019-09-03) (1)为什么在JDK1.7的时候是先进行扩容后进行插入,而在JDK1.8的时候则是先插入后进行扩容的呢?

    36830

    彻底服了:HashMap 夺命二十一问,顶不住了!

    (JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法) (注意:当碰撞导致链表大于 TREEIFY_THRESHOLD = 8 时,就把链表转换成红黑树) 获取对象时,将 K 传给 get()...8.数组扩容的过程? 创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。...9.拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?...HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁); 而针对 ConcurrentHashMap,在 JDK 1.7 中采用 分段锁的方式;JDK 1.8 中直接采用了...19.ConcurrentHashMap 在 JDK 1.8 中,为什么要使用内置锁 synchronized 来代替重入锁 ReentrantLock?

    55620

    阿里 HashMap 面试夺命连环 21 问

    (JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)(注意:当碰撞导致链表大于 TREEIFY_THRESHOLD = 8 时,就把链表转换成红黑树) 获取对象时,将 K 传给 get() 方法...8、数组扩容的过程? 创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。...9、拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?...HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁); 而针对 ConcurrentHashMap,在 JDK 1.7 中采用 分段锁的方式;JDK 1.8 中直接采用了...18、针对 ConcurrentHashMap 锁机制具体分析(JDK 1.7 VS JDK 1.8) JDK 1.7 中,采用分段锁的机制,实现并发的更新操作,底层采用数组+链表的存储结构,包括两个核心静态内部类

    89210

    这21个刁钻的HashMap面试题,我把阿里面试官吊打了

    (JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)(注意:当碰撞导致链表大于 TREEIFY_THRESHOLD = 8 时,就把链表转换成红黑树) 获取对象时,将 K 传给 get() 方法...5.为什么要用异或运算符? 保证了对象的 hashCode 的 32 位值只要有一位发生改变,整个 hash() 返回值就会改变。尽可能的减少碰撞。...8.数组扩容的过程? 创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。...9.拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?...HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁); 而针对 ConcurrentHashMap,在 JDK 1.7 中采用 分段锁的方式;JDK 1.8 中直接采用了

    2.6K21

    21个刁钻的HashMap 面试

    (JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)(注意:当碰撞导致链表大于 TREEIFY_THRESHOLD = 8 时,就把链表转换成红黑树) 获取对象时,将 K 传给 get() 方法...8.数组扩容的过程? 创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。...9.拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?...HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁); 而针对 ConcurrentHashMap,在 JDK 1.7 中采用 分段锁的方式;JDK 1.8 中直接采用了...19.ConcurrentHashMap 在 JDK 1.8 中,为什么要使用内置锁 synchronized 来代替重入锁 ReentrantLock?

    43710

    HashMap 在 JDK1.7 和 JDK1.8 的区别

    遇到的一个问题,之前没有好好思考过这个问题,现在研究一下 区别 最重要的一点是底层结构不一样,1.7是数组+链表,1.8则是数组+链表+红黑树结构; jdk1.7中当哈希表为空时,会先调用inflateTable...()初始化一个数组;而1.8则是直接调用resize()扩容; 插入键值对的put方法的区别,1.8中会将节点插入到链表尾部,而1.7中是采用头插; 1.7采用头插法,会引发环形链表死循环;1.8采用尾插法...; jdk1.7中的hash函数对哈希值的计算直接使用key的hashCode值,而1.8中则是采用key的hashCode异或上key的hashCode进行无符号右移16位的结果,避免了只靠低位数据来计算哈希时导致的冲突...,计算结果由高低位结合决定,使元素分布更均匀; 扩容时1.8会保持原链表的顺序,而1.7会颠倒链表的顺序;而且1.8是在元素插入后检测是否需要扩容,1.7则是在元素插入前; jdk1.8是扩容时通过hash...,因为转化为树还需要时间和空间,所以此时没有转化成树的必要。

    1.4K30

    HashMap 这套八股,不得背个十来遍?

    总体来说,JDK 1.7 中 HashMap 的底层数据结构是数组 + 链表,使用 Entry 类存储 Key 和 Value;JDK 1.8 中 HashMap 的底层数据结构是数组 + 链表/红黑树...当然,这里的 Entry 和 Node 并没有什么不同,我们来看看 Node 类的源码: // HashMap 1.8 内部使用这个数组存储所有键值对 transient Node[] table...在 JDK 1.7 的时候,采用的是头插法,看下图: ? 不过 JDK 1.8 改成了尾插法,这是为什么呢?因为 JDK 1.7 中采用的头插法在多线程环境下可能会造成循环链表问题。...总结一下 HashMap 在 JDK 1.7 和 JDK 1.8 中为什么不安全: JDK 1.7:由于采用头插法改变了链表上元素的的顺序,并发环境下扩容可能导致循环链表的问题 JDK 1.8:由于 put...,也就是加上 synchronized 3)使用线程安全的 ConcurrentHashMap 类代替,该类在 JDK 1.7 和 JDK 1.8 的底层原理有所不同,JDK 1.7 采用数组 + 链表存储数据

    70530

    Java集合之Map接口

    也就是说 HashMap 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。...JDK 1.8 HashMap 的 hash 方法源码: JDK 1.8 的 hash 方法 相比于 JDK 1.7 hash 方法更加简化,但是原理不变。...底层数据结构:JDK1.7 的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟 HashMap1.8 的结构一样,数组+链表/红黑二叉树。...当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。...ConcurrentHashMap 线程安全的具体实现方式/底层具体实现 JDK1.7 首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问

    71840

    Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day19】—— 集合框架3

    车票 面试题1:先说一下大家为什么要选择ConcurrentHashMap? 面试题2:ConcurrentHashMap在JDK1.7、1.8中都有哪些优化?...追问1:JDK1.8为什么使用Synchronized来代替ReentrantLock? 追问2:讲讲ConcurrentHashMap的 get put 过程?...JDK1.7 —— put操作 JDK1.7 —— get操作 JDK1.8 —— put操作 JDK1.8 —— get操作 追问3:ConcurrentHashMap 的 get 方法是否要加锁,为什么...追问1:JDK1.8为什么使用Synchronized来代替ReentrantLock?...JDK1.8为什么使用内置锁synchronized来代替重入锁ReentrantLock,主要有以下几点: 因为粒度降低了,在相对而言的低粒度加锁方式,synchronized并不比ReentrantLock

    47510
    领券