破碎的残阳,我们逆光【连载小说】- HashMap剖析


“行到水穷处,坐看云起时”                     

前言:

  偶尔翻阅了自己当时高中时代写的日志,发现了几篇自己多年未打开的自写小说草本,小说的名字叫做《破碎的残阳,我们逆光》,可能这是那个懵懂的年纪排解学习压力的一种方式吧,当年有心想把它继续写下去,一直完结,奈何高中时代时间紧张,加上有些表达上的畏手畏脚,不敢过多展露偏情感的一些东西,总是担心被同学读者发现了自己怀揣着的梦想以及不能说的秘密,如今看来,如果一篇文章不能倾其感情,即使写出来也是枯燥无味的,倒不如大胆表达。我知道程序员的我们在写博客时很为难,如果一篇文章总是长篇大论的技术堆砌,读者读起来也会昏昏欲睡,无法正视那些学术般的话语;如果一昧嬉笑打骂,没有的扎实的知识灌输在博文上,一些技术草草讲过,那可能没有灵魂没有看的价值。于是我想做个尝试,一边来完成我高中时期的梦想将小说写下去,一边也能在给博友闲来无事看小说的时候点缀些技术知识的分享在字里行间,我不知道自己能不能用自己的文字契合好,但只能尽力去做了,如有怪异的感觉,欢迎在评论区指出。

“也许换一扇窗户,技术男和文艺青年两个灵魂也是可以共存的”

第一章:圣林,初相遇

圣林大学,华夏国有名的综合性重点私立大学,来到这里的学生非富即贵,亦或者有着骄人的学习成绩,圣林大学所在的圣林市,更是有水城之称的国家模范城市,很多著名的企业都纷纷来这里投资,圣林市和燕京、申城并称为华夏国三大城市。

......

开学伊始,圣林大学前,人乌压压的挤着,燥热的天气配上拥挤带来的烦躁感仿佛能把全身上下的每个细胞挤破。

安晓雅穿着蓝色的流光裙、拖着笨重的行李箱吃力的走着,脸上的微笑却看不出她的疲惫,这与周围人不耐烦的表情形成了鲜明的对比,是的,她很开心,考入圣林大学是她梦寐以求的事情,她做到了,不仅如此,她还是和她心目中暗寐的那位一块考入的......想到这,她心里更加的美滋滋了,开始幻想着自己即将到来的大学生活。

也许是女孩思考的太沉迷了,不远处一辆火红的兰博基尼跑车朝她所在的方向奔来她也丝毫没有察觉,随着跑车猛地踩下刹车停在了离她不到5公分的地方,安晓雅这才如梦初醒,吓得摔倒在地。

“好痛!”安晓雅匍匐在地上低吟到。吃痛的表情在她不施粉黛却十分美丽的脸上流露出,惹人同情。

周围人早已怒目而视,本来现在是新生报到的日子,人已经够多了,居然还有人开车来,开车就开车,居然还是限量款的兰博基尼跑车,还把这么一位小美女给撞了,大家的仇富心态和内心的不平衡致使他们同仇敌忾,纷纷谴责起车里的人。

车上的人似乎没有下车的打算,皱起的眉头在他浓密的刘海间若隐若现,“新生真是麻烦。”苏忧心里暗想道。

正当苏忧考虑要不要下车一趟的时候,有人毫不客气的踢了他的爱车两脚,一个清澈的女音响起:“开个跑车有什么了不起,你以为你是谁啊,快下车道歉!”

只见一位穿着黄白相间格子衫,宽松牛仔裤,小白鞋,扎着利索马尾辫的女孩好心的搀扶起安晓雅,怒视着跑车的方向。晓雅轻声说道:“谢谢学姐。”

苏忧抬头一瞥,一瞬间的内心慌乱接着转为妖孽的嘴角一笑:原来是她。

是的,苏忧是认识她的,但她或许并不认识苏忧,故事还在2个月前,那时候刚放暑假,夏沫她以暑假实习为名去参加过星宇科技公司的面试,而那一天,苏忧被父上大人以熟悉公司业务为名,派他去了苏氏集团下的子公司星宇科技学习,说是学习,真的到了公司后,又有谁敢管,刚巧有一天公司在招实习生,苏忧觉着看面试挺好玩,就提前躲在面试会议室的暗间处,观察着整个面试过程,当然,面试官和面试者是看不到苏忧的。

整个面试无聊透顶,苏忧都怀疑自己做错了决定,整个人听得昏昏欲睡,直到夏沫的到来......

面试官:"姓名?"

夏沫:“夏沫.”

面试官:“性别?”

夏沫瞪大了双眼:“啥?你这是面试还是审问犯人啊,性别这么明显看不出来么”

面试官头都没抬起来,似乎没注意夏沫话里的火气,嘀咕到:“才读一年大学,还是女的,面试简直浪费时间,不知道HR咋筛选的简历,这都能给放过来”

也许面试官曾被前女友抛弃曾被女程序员拒绝过求爱亦或者是面试一整天有些不耐烦了,也根本没意识到苏大少在暗间观察,居然在面试过程中如此出言不逊。苏忧也有些不喜,决定一会出去后好好和张和(面试官)交流交流感情。

夏沫怒了,你以为大夏天的我想出来面试啊,我难道不想美滋滋的在空调房里吃水果追剧看欧巴,这不是想攒点资历,为将来申请推免研究生准备么!!!

想罢,站起来一拍桌子,朝面试官说到:“读一年大学怎么了,女的又怎么了,有本事你考考我!”

面试官仿佛来了兴趣,也许是想着将她一次性打击到,不紧不慢的说到:"缓存击穿、穿透、雪崩是什么情况,如何解决?"

这个Redis相关的问题对于一个工作一两年的人或许回答起来游刃有余,但对于一个刚读了大学一年还没接触实际项目的人来讲,确实有点为难。

夏沫沉默不厌,内心却爆起了粗口,“击穿穿透雪崩这都是啥东西,雪山崩塌了么?我TMD怎么知道!”

张和看夏沫不说话,轻蔑的笑了下:“怎么着,不会啊?问你个基础的,HashMap的实现原理是什么?”

夏沫怒了,反手拿起面试官的水杯,将水泼到了面试官的脸上:“哈希你大爷!”说罢,便直接走了,留下一道倩影,面试官一个人在那目瞪口呆半天缓不过神来,好一会儿才想起来喊保安。可此时的夏沫已经拉着等待自己的闺蜜离开了星宇科技,闺蜜看见夏沫一脸怒气的出来,便询问发生了什么?夏沫没好气的说:“我泼了面试官一脸水。”“啥,你疯了啊姑奶奶,平时胡闹就罢了,怎么面个试还捅娄子,听说他们社会人报复心理很强的!”闺蜜一脸担忧到。“谁让他看不起女程序员,”说完前半句夏沫又阴险一笑,“放心吧,我留的手机号,身份证号以及学校都是假的,夏妈妈曾经说过,社会很复杂,不要轻易透露个人信息,所以他想报复我也找不到我。”“哈哈,你牛!”

......

苏忧停止了回忆两个月前的事情,没想到会在这碰到她,当初他曾寻过她,可没想到她留下的一切信息都是假的,只能期待有缘再见。至于当时的面试官张和,在苏忧和他长达30秒的交心后,张和就莫名其妙的提交了辞呈,叹息的离开了岗位。

苏忧打开了车门,一身黑色皮衣打扮显得硬气逼人,他缓缓摘下墨镜,一股子阳刚之气在他眉宇间迸射出,吸引着周围人群中的女性一阵阵骚动,就连夏沫,也呆住了几秒。苏忧看了眼受伤的安晓雅,又把目光移到了夏沫身上,缓缓问道:“计算机系的女程序员?”夏沫诧异了一下:“你怎么知道?”苏忧故作一副嫌弃的表情:“就你这身没品位的打扮,格子衫的标配,用脚丫子都能猜出来。”夏沫气的咬牙切齿:“你才衣服没品呢,你人更没品,撞了人都不知道道歉,没男子风度,恬不知耻!”

苏忧沉默下不知道在思考些什么,突然想到了什么可笑的事情:“这样吧,为了表达对你计算机系的尊重,金融系的我随便问你几个计算机相关的问题,如果你能答上来,我不仅会向这位小学妹当众道歉,还会请在场的所有人去敦煌大酒店吃饭。但是如果答不上来,你就得满足我一个你力所能及的请求,放心,不会是违背道德和良心的事情。”周围人一片唏嘘,敦煌大酒店,那可是圣林市最高规格的酒店了,平时普通人想都不敢想,于是便有人鼓吹到:“美女别怕他,去应战,他一个金融系的计算机相关知识怎么会比得过你。”夏沫也很纠结,其实她基础知识不差,大一还拿了一等奖学金,而且她参加完那次面试后还回来很狠的闭关修炼了一阵,再说,一个金融系的即使学过几天计算机又能懂多少,想到这,便鼓足了勇气,说:“我答应你了,你问吧。”安晓雅此刻却觉得不对劲,拉了拉夏沫衣角暗示她别冲动。夏沫拍了怕她的手,让她别担心。

苏忧脑子里在思索着两个月前他在办公室看过的那本招java程序员的面试题,没错,他是位记忆力惊人的天才,当时虽然只是随意翻看下,但就是很奇怪的印在了他的脑海里。苏忧缓缓问道:“你听好了,HashMap的底层实现原理是什么?”夏沫愣了一下,感觉这个问题曾经有人问过她一样,略加思考便缓缓说道:“第一:HashMap是根据散列表(hashing)的原理,通过put(key,value)和get(key)实现了存储数据和获取数据。第二:HashMap在存储数据时,会调用put(key,value)方法,此时他会调用一个hashcode(哈希函数),通过这个哈希函数会计算出对应的hash值,这个 hash值其实就是一个bucket的位置,能确定在散列表上的一个位置,当然这个散列表就是一个数组,能将value值存进去。第三:HashMap在获取数据时,会调用get(key)的方式,此时他也会调用哈希函数求出key的哈希值,找到在散列表上的位置,然后取出数据。第四:还有一种情况就是发生hash碰撞了,就是不同的key通过哈希函数计算出来的哈希值是一样的,这时候就会把这不同的数据都存在hash表的那个位置,只不过那个单元里存储的结构是链表,查询时就先找到散列表的那个位置,然后通过遍历链表的方式通过比较key值来找到正确的键值对key-value”震惊,大写的震惊!周围人都惊呆了,原来不止男学霸很帅,女学霸也同样很女神的!

苏忧笑了一下:“不错,有两把刷子,那你再告诉我JDK8中的HashMap的底层数据结构。”“在JDK8中,HashMap的底层采用的是数组 + 链表 + 红黑树的数据结构,链表长度变为8并同时满足HashMap中元素大于64时则变为红黑树,当链表长度小于6时又变回链表。”夏沫不惧的回答到。“为什么HashMap的底层中链表长度大于8变为红黑树,小于6变为链表,临界值不一样呢?”苏忧继续追问道。夏沫得意的拨了一下自己的碎刘海:“你听好了,首先要知道红黑树TreeNode占用的空间是普通Node(链表)的两倍,这也算是为了一个时间和空间的均衡,其次呢,这也是为了遵循泊松概率,在达到8个元素时概率为千分子一,而此时链表的性能也很差了,在这种极端的情况下才会把链表转化为红黑树。通常情况下很难达到8,都会是使用链表,二红黑树算是一种提高性能的应对策略。还有就是,临界值设定一样的话,在极端情况下容易发生树化和非树化的转换,影响性能。链表往红黑树转化的话需要一定的过程。”

周围的人看呆了,就算是计算机系的一些学长学姐也自愧不如,他们是学过一些数据结构,也了解过Hash表,但是这些复杂的变化仿佛是存在那些非重点标注的内容里面吧,老师说过期末不考的。。

其实这也算是夏沫幸运,自从两个月前被张和面试时问了HashMap相关的问题没答上来,自己就回来后各种百度,狠狠恶补了下相关知识,所以这才应对自如,等等,夏沫似乎想到了什么,“他为什么会一再追问我HashMap相关的知识.....且看他下一个问题还问我什么。”

夏沫也许是有些飘了:“我再给你两个问题的机会。”苏忧有些意外但也不着急,即使真被她全答对,请大家去敦煌大酒店吃饭也不是做不到,反而还有机会把酒言欢,便继续问道:“你听好了,那请你告诉我JDK7和JDK8中HashMap的区别,起码从五个方面回答我奥!”这次夏沫想的时间长了一些,在努力的回忆些什么,她有些不确定的回答到:“一:底层结构的不同,jdk7是数组+链表,存储节点数据Entry,JDK8则是数据+链表+红黑树的方式存储Entry。Jdk8当链表长度大于8同时HashMap中的元素个数大于64时则转换为红黑树;二:Hash冲突时插入数据的方式是不同的,JDK7采用的是头插法,JDK8采用的是将节点插入到链表尾部;三:Hash函数是不一样的,jdk7直接使用的key的hashcode值计算,扰动复杂,哈希函数复杂,5次异或加4次位运算 ,一共是9次扰动,这也是为了实现散列。jdk8则是采用key的hashcode异或上key的hashcode进行无符号右移16位的结果,结果更加的散列,但是扰动却简单了,是一次异或加一次位运算;第四:是扩容策略的不同,jdk7会重新的计算hash,不小于threshold阈值直接2倍扩容。jdk8中不会重新计算hash,看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成原索引加上旧的数组长度。至于第五....”夏沫有些头痛,她怎么没记得还有第五条,“你是不是忽悠我,我怎么不记得有第五条?”夏沫不确定的问苏忧。苏忧白了她一眼说:“程序员小姐,给你个提示,当hash表剩余空间为空时,它们.....”“JDK7会先调用inflateTable()初始化一个数组,而1.8则是直接调用resize()进行扩容。”夏沫抢答到,“这可是我自己想起来的,可不是你告诉我的。”

“不错不错,还算有点脑子,配得上我在这和你耗了10多分钟。”苏忧阴险的笑了笑,“你听好了,JDK8中HashMap源码中添加数据是怎么样一步步实现的,记着,我说的是源码奥。”阴险,大写的阴险,居然问一个刚上大学一年的源码问题,这种问题即使工作了三四年也不一定知道啊!周围变的静谧起来,都看向了夏沫,期待此刻奇迹的发生。夏沫此刻也沉默了下来,没有思考也没有任何回答,是的,她确实不会,源码这东西太深,她还未曾接触到。

“首先判断Node[] table成员变量是否初始化,如果没有,则调用resize进行扩容,这个Node类型的数组存储了HashMap真正的数据。接下来,通过传入键值对的key的hashcode和容量,马上得到该映射所在的table数组的下标,并通过数组的取下标操作,得到该哈希桶的头节点。如果没有发生hash碰撞(头节点为null),那么直接执行新增操作,如果发生了hash碰撞(头节点不为null),那么分两种情况:一是与桶内的某个元素‘==’返回true,或者equals判断相同,执行替换操作;二是如果与桶内的所有元素不相等,执行新增操作,可能是链表也可能是红黑树的插入。接下来链表新增操作后会有两个判断:如果哈希值是单链表结构,且桶内的数量超过了8,且size大于等于了64,那么该哈希桶转换为红黑树结构;如果新增的size大于了threshold,那么调用resize扩容。不知道我的回答可让你满意。”人群中突然传了一个清澈的男子声音,一名男子缓缓走上前来,只见他身体瘦弱,脸色苍白,四周还留着鬓角和燕尾,一身白衣,黑框眼镜,像极了2012年那会儿盛行非主流的男孩打扮,不过相貌尚可,算的上是中上游,难得的是他的眼神干净坚毅,似乎未被尘世所同化。

“梓然哥哥。”安晓雅开心的朝那个看起来弱不禁风的白衣男子喊道。

白衣男子笑了笑:“不好意思晓雅,我来晚了。”

说罢,路梓然走到苏忧的面前,两个人四目相对,这两个男人之间仿佛随时会出现一道道电闪雷鸣,一个身材健壮面容阳刚俊美,身高足有187,另一个看起来大病初愈孱弱不堪,只有178的高度。“我的妹妹需要一个道歉。”路梓然不容拒绝的说到。

......

好吧,我们的男主终于姗姗来迟,在第一章结束的时候赶到了。

“犹记得初相逢,丹心同,年少懵懂。回首处望苍穹,千里共当时明月终。”

后言:

  真正的男主在结尾处姗姗来迟,真正的女主还没出现,可能这样强行的将小说和技术融合在一块有种怪异的感觉(反正我是觉得挺怪的),一个26岁的程序员又开始写起了学生时代的言情小说,有种爷青回的感觉,可能人物刻画的还不够形象,后期会慢慢调整修复。

《破碎的残阳,我们逆光》连载小说- HashMap剖析的更多相关文章

  1. HttpClient拉取连载小说

    上午刚入手的小说,下午心血来潮想从网站上拉取下来做成电子书,呵呵,瞎折腾-说做就做- [抓包] 这一步比什么都重要,如果找不到获取真正资源的那个请求,就什么都不用做了- 先是打算用迅雷把所有页面都下载 ...

  2. HashMap就是这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合以及散列表.Map集合.红黑树的基础了: Collection总览 List集合就这么简单[源码剖析] Ma ...

  3. Java中关于HashMap源码的研究

    1.基础知识 1.数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难. 2.链表 链表存储区间离散,占用内存比 ...

  4. HashMap面试必问的数据结构相关知识

    如果在看这篇文章时,对HashMap的结构还不是很了解,建议你参考前段时间写的<刨死你系列——HashMap剖析(基于jdk1.8)>,可能会对下面的提及到知识点有些帮助. 1:HashM ...

  5. SequenceInputStream

    SequenceInputStream从名字上看, 他是一个序列字节输入流 既然是个序列 那么意味着 SequenceInputStream装着许多的输入流 所以 可以用他来合并文件 Sequence ...

  6. “享受”英语的快乐—我是如何学英语的

    一:扬长避短重新认识英语课本 目前市场上的课本都有弊端,<新概念><走遍美国><疯狂英语>等等,不怪你学不下去,不是你的问题,课本本身就有漏洞的,但我怎么学的呢,我 ...

  7. python网络爬虫之初始网络爬虫

    第一次接触到python是一个很偶然的因素,由于经常在网上看连载小说,很多小说都是上几百的连载.因此想到能不能自己做一个工具自动下载这些小说,然后copy到电脑或者手机上,这样在没有网络或者网络信号不 ...

  8. Python爬虫初学(二)—— 爬百度贴吧

    Python爬虫初学(二)-- 爬百度贴吧 昨天初步接触了爬虫,实现了爬取网络段子并逐条阅读等功能,详见Python爬虫初学(一). 今天准备对百度贴吧下手了,嘿嘿.依然是跟着这个博客学习的,这次仿照 ...

  9. Android框架式编程之RxJava(一):HelloWorld

    Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...

随机推荐

  1. HTTP-常用请求头

    HTTP-常用请求头 Accept:表示客户端可以接收的数据类型 Accpet-Language:表示客户端可以接收的语言类型 User-Agent:表示客户端浏览器的信息 Host:表示请求时的服务 ...

  2. pycharm中操作git

    pycharm操作git 1.找到VCS 2.

  3. NOI Online 2021 入门组 T1

    Description 题目描述 Alice.Bob 和 Cindy 三个好朋友得到了一个圆形蛋糕,他们打算分享这个蛋糕. 三个人的需求量分别为 \(a, b, c\),现在请你帮他们切蛋糕,规则如下 ...

  4. MariaDB Spider 数据库分库分表实践

    分库分表 一般来说,数据库分库分表,有以下做法: 按哈希分片:根据一条数据的标识计算哈希值,将其分配到特定的数据库引擎中: 按范围分片:根据一条数据的标识(一般是值),将其分配到特定的数据库引擎中: ...

  5. 用了这么久 Linux ,才知道这些概念。。。

    Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点.所有的文件和目录都位于 / 路径下,包括我们经常听到的 ...

  6. HTML加载动画实现

    在页面加载完成之前或者执行某操作时,先显示要显示的加载动画. 实现原理 先定义一个加载动画元素(最好是纯CSS实现,图片的话可能慢一点),当页面未加载完成之前,先使其"可见",当页 ...

  7. linux 编译C++

    转载请注明来源:https://www.cnblogs.com/hookjc/ makefile文件内容: main:main.o fun1.o fun2.o g++ -o main  main.o ...

  8. Java.lang.Integer类中toString(int i, int radix)的具体实现

    Java.lang.Integer.toString(int i,int radix)方法可以实现将一个int类型的10进制的数据转换为指定进制的数据. api文档中介绍: 返回第二个参数指定的基数中 ...

  9. 开发时Blocks跟Delegates如何选择----董鑫

    1.大多数delegate protocols 都拥有几个消息源. 以GKMatch为例(A GKMatch object provides a peer-to-peer network betwee ...

  10. android TextView属性详解

    RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false     android:layout_centerHrizontal  水平居中      android:l ...