判定程序员等级,HashMap就够了

JDK1.8  HashMap源码分析

用到的符号:

^异运算:两个操作数相同,结果是;两个操作数不同,结果是1。

&按位与:两个操作数都是1,结果才是1。

一、HashMap概述

在JDK1.8之前,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用数组+链表+红黑树(二叉树的优化实现是一种平衡二叉树,可以降低数的深度)实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

jdk1.8之前的hashmap都采用上图的结构,都是基于一个数组和多个单链表,hash值冲突的时候,就将对应节点以链表的形式存储。如果在一个链表中查找其中一个节点时,将会花费O(n)的查找时间,会有很大的性能损失。到了jdk1.8,当同一个hash值的节点数不小于8时,不再采用单链表形式存储,而是采用红黑树。

二、了解Hash函数

我们先了解一下Hash的源码:

代码执行过程:如果key为空,返回0;如果key不为空,返回原hash值和原hash值无符号右移16位的值按位异或的结果。(把低16位和高16位进行异或运算)。因为低位重复概率计算大,低位和高位异或运算可以提交数组的利用率,使数组分布均匀。

按位异或就是把两个数按二进制,相同就取0,不同就取1。

比如:0101 ^ 1110 的结果为 1011,异或的速度是非常快的。

把一个数右移16位即丢弃低16为,就是任何小于216的数,右移16后结果都为0(2的16次方再右移刚好就是1)。

任何一个数,与0按位异或的结果都是这个数本身。

所以这个hash()函数对于非null的hash值,仅在其大于等于216的时候才会重新调整其值。

但是调整后又什么好处呢?

我们先看下put的时候,这个hash值是怎么处理(部分源码)的:

在寻找桶位的时候,这个hash值为与上table的zise-1,初始为16,我们就拿16来举例.

以为算法是hashValue & size - 1 ,此时size-1=15的二进制为 1 1 1 1 ,也就是任意类似16进制0x?0(二进制最后四位为0000)的hash值,都会被存储到位置为0的桶位上,一个桶中的元素太多,就一定会降低其性能。我们知道HashMap是一个数组+链表,就是在下标相同的位置下面挂一个单项的链表,那数组的下标需要计算出来,必须保证在一定的范围内,是通过【(n-1)&hash】计算机计算的是二进制,比如数组大小必须是2的N次幂,权重是0.75,数组初始值是16,权重等于12(16*0.75),当等于12数组会扩容。扩容之后对数组进行重新分配。当链表的大小大于8的时候会转化为红黑树。数组下标计算方式:(0101010101010101010101010101&00000000000000000001111)以16来说,十六进制的二进制表示后面的0,N-1的二进制结尾是1111,两者进行与操作最大值是1111,1111的16十六进制是15,然后把Node节点放入这个位置,这样来计算下标。

总结如下:

原文地址:https://www.cnblogs.com/zj-blog/p/8965653.html

时间: 2024-10-18 10:31:22

判定程序员等级,HashMap就够了的相关文章

判定Java程序员等级,HashMap就够了

JDK1.8  HashMap源码分析 用到的符号: ^异运算:两个操作数相同,结果是;两个操作数不同,结果是1. &按位与:两个操作数都是1,结果才是1. 一.HashMap概述 在JDK1.8之前,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低.而JDK1.8中,HashMap采用数组+链表+红黑树(二叉树的优化实现是一种平衡二叉树,可以降低数的深度)实现

阿里巴巴的程序员等级2019

根据近年数据,中国现有程序员500万左右,其中P1.P2数量占据了近100万,P8及以下程序员约有490万,P9及以上仅有10万. 80后是企业的技术支柱,90后已开始逐步成为企业的中坚力量.BAT的大佬横行,业内的散客也不容小觑.90后有人在P4彻夜敲代码,也有人正迈入P8. 目前并没有对程序员等级进行明确的划分,很多时候是参照BAT的程序员等级进行判定. P1.P2 入门 1.了解计算机专业的基础知识,懂计算机的基本操作,掌握一门基础的程序语言即可. 2.BAT一般空缺,为非常低端岗位预留.

【分享】你敢来挑战?程序员等级

参差不齐的程序员按照技术水平分为从“读写”到“上帝”,共十一个阶段,以帮助广大程序员找到自身定位并从中发现自己发展方向.以下是文章摘要: 随着技术发展,编程悄然融入了我们的生活.我们已然离不开那些程序和编程语言.很多人都在不同程度地谈论着如何编程,也诞生出很多编程语言排行,那么程序员到底应该如何分级呢? 首先要明白什么是程序员.设计自己的Apache Web服务器的家伙?制作一个复杂Excel的家伙?还是能自己开发RPG的家伙?Minecraft的玩家?这些都属于程序员的哪一个级别呢?当我们说:

java程序员等级一览:都来看看自己所处的等级

凡人:买本书凑凑热闹,听得多写的少,过段时间就把老师教的都忘了.这个阶段是刷掉人最多的阶段,也是从凡人到程序员本质区别的阶段.你的日后成就在于你的习惯与态度.隔一段时间整理自己的知识体系是重中之重.如果你做得多于看代码,那么恭喜你,你进入下一阶段. 筑基:评价标准:懂了怎么配置环境变量,懂得bin目录下都有什么,java命令行基本懂点.明白了变量类型,也碰过几个坑,知道java的值传递,引用传递,脑子里有点函数和类的概念.try catch用不好,用println多余log4j,知道继承但就是不

黑马程序员——通过HashMap的value值,得到key键值

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- HashMap中key值是唯一的,但value是不唯一的:同一个value可能返回多个key下面是个例子:找出value是“value”的key 1 import java.util.HashMap; 2 import java.util.Iterator; 3 import java.util.Map; 4 import java.util.Set; 5 public class HashM

[zz]论程序员

g9老大多年前的趣文: 论程序员 根据钱钟书先生的<论文人>胡改的.聊搏一笑,文责不负.程序员是可嘉奖的,因为他虚心,知道上进,并不拿身分,并不安本分.真的,程序员对于自己,有时比旁人对于他还看得轻贱:他只恨自己是个程序员,并且不惜费话.费力.费时.费纸来证明他不愿意做程序员.不满意做程序员,在这个年头儿,这还算不得识时物的俊杰么? 所谓程序员也者,照理应该指一切写代码.维护代码.设计软件的人说.但是,在事实上,程序员一个名词的应用只限于为公司编写软件之类的作者,今人所谓“IT蓝领”.“写码猴

【转】成为Java顶尖程序员 ,看这11本书就够了

成为Java顶尖程序员 ,看这11本书就够了 转自:http://developer.51cto.com/art/201512/503095.htm 以下是我推荐给Java开发者们的一些值得一看的好书.但是这些书里面并没有Java基础.Java教程之类的书,不是我不推荐,而是离我自己学习 Java基础技术也过去好几年了,我学习的时候看的什么也忘了,所以我不能不负责任地推荐一些我自己都没有看过的书给大家. 作者:来源:攻城狮之家|2015-12-31 09:55 收藏 分享 “学习的最好途径就是看

没有什么能够阻挡,我对自由的向往--致程序员

摘要:每每周末就特想做一个自由的傻帽,做一场天马行空的年少轻狂梦,可以在拥挤的公交车上抢了小朋友的座,可以望向车窗外川流的人潮矫情的想一下海子的诗,当然高级私家车什么的自动屏蔽.但作为一名社群主义奉行者,作为一个社会人,只能把自由的诉求倾注于自由职业,开发者也可以成为自由开发者,享受这个无限勾引人的特殊职业吗? 关于自由的命题丰富且引人遐想,但在当下选择自由职业是逃避现实,还是为了追求更高的生活质量,也许已经属于这个群体的人也未必真正的明白.程序员的工作性质.所需环境等因素使之有了做自由职业者的

Java程序员,如果你想要搞明白CDN,这篇应该够了!

程序员,如果想要搞明白CDN,这篇应该够了!最近在了解边缘计算,发现我们经常听说的CDN也是边缘计算里的一部分.那么说到CDN,好像只知道它中文叫做内容分发网络.那么具体CDN的原理是什么?能够为用户在浏览网站时带来什么好处呢?解决这两个问题是本文的目的. CDN概念CDN全称叫做"Content Delivery Network",中文叫内容分发网络. 实际上CDN这个概念是在1996年由美国麻省理工学院的一个研究小组为改善互联网的服务质量而提出的.那么它到底是怎么改善互联网服务质量