问与答 · JAVA基础

emm...

HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。

  • 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

  • 链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

  • 哈希表:那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。哈希表有多种不同的实现方法,我们可以理解为“链表的数组”。

哈希表是由 数组 + 链表 组成的,一个长度为 16 的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过 hash(key)%len 获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中, 12%16=12 , 28%16=12 , 108%16=12 , 140%16=12 。所以 1228108 以及 140 都存储在数组下标为 12 的位置。

JDK8中,HashMap 加入了红黑树的使用,当节点长度大于8并且数组的长度大于64时,该节点链表就会转化成红黑树。数组长度小于64并且节点长度大于8时,仅仅扩容,并不会将链表转换成红黑树。

相关文献 -> http://www.importnew.com/28263.html

HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。

HashMap计算 Key 值在数组中的位置是使用 Key.hashcode()数组长度减一 进行 & 运算。当长度是 2 的N次幂时,数组长度减一 的二进制实则为 N-1个1。进行与或运算时,能够快速取到小于自己的一个整数。比 % 取模速度更快。

HashMap,HashTable,ConcurrentHashMap的区别。

  • HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都经过synchronized修饰。因为同步、哈希性能等原因,性能肯定是HashMap更佳,因此HashTable已被淘汰。

  • HashMap的键和值都允许有null存在,而HashTable则都不行,在HashTable中put进的键值只要有一个null,直接抛出NullPointerException。

  • ConcurrentHashMap是线程安全的HashMap的实现。HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。

  • ConcurrentHashMap引入了分割(Segment),上面代码中的最后一行其实就可以理解为把一个大的Map拆分成N个小的HashTable,在put方法中,会根据hash(paramK.hashCode())来决定具体存放进哪个Segment,如果查看Segment的put操作,我们会发现内部使用的同步机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个Map(HashTable就是这么做的),相对于HashTable提高了多线程环境下的性能,因此HashTable已经被淘汰了。

极高并发下HashTable和ConcurrentHashMap哪个性能好,如何实现的。

上个问题已经回答了,在极高并发下ConcurrentHashMap的性能要好于HashTable,因为ConcurrentHashMap采用的是分段锁,不会造成整个对象锁住,在高并发时性能明显好于Hashtable。

HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。

  • 多线程put时可能导致元素丢失,原因:当多个线程同时执行addEntry(hash,key ,value,i)时,如果产生哈希碰撞,导致两个线程得到同样的bucketIndex去存储,就可能会发生元素覆盖丢失的情况

  • 多线程put时可能会导致get无限循环,具体表现为CPU使用率100%;原因:在向HashMap put元素时,会检查HashMap的容量是否足够,如果不足,则会新建一个比原来容量大两倍的Hash表,然后把数组从老的Hash表中迁移到新的Hash表中,迁移的过程就是一个rehash()的过程,多个线程同时操作就有可能会形成循环链表,所以在使用get()时,就会出现Infinite Loop的情况。

相关文献 -> https://www.cnblogs.com/hunrry/p/9183027.html

java中四种修饰符的限制范围。

  • private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象 访问,其子类不能访问,更不能允许跨包访问。

  • default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。

  • protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本 身的方法及子类访问,即使子类在不同的包中也可以访问。

  • public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且 允许跨包访问。

Object类中的方法。

clone()

clone()函数的用途是用来另存一个当前存在的对象。

hashCode()和equals()

equals()用于确认两个对象是否相同,hashCode()用于获取对象的哈希值,哈希值相同的对象不一定equals(),equale()返回true的两个对象一定相同。

toString()

toString()返回一个String对象,用来标识自己 。

getClass()

getClass()返回一个Class对象。因为返回的是一个class对象,后面可以跟class类的方法。用的是谁的构造函数,那么getClass返回的就是谁的类型,getClass()经常用于java反射机制。

finalize()

这个函数在进行垃圾回收的时候会用到,匿名对象回收之前会调用到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,412评论 1 14
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,095评论 0 8
  • 九种基本数据类型的大小,以及他们的封装类。(1)九种基本数据类型和封装类 (2)自动装箱和自动拆箱 什么是自动装箱...
    关玮琳linSir阅读 1,877评论 0 47
  • 优优: 此刻的你正做着甜甜的美梦吧。 小学生语文能力竞赛你以绝对优势闯入决赛,祝贺你哦。捷报频传,你让妈...
    晓寒iyoyo阅读 161评论 0 1
  • 很高兴自己已经坚持跑步21天,因为坚持21天很可能会形成习惯。这21天中有两天没有跑步,有一天全天下雨,还有一天打...
    魏魏说阅读 446评论 2 5