无极分期网站,网站开发实验报告可行性分析,制作一个网站平台,如何设计小程序第一题. HashMap和HashTable有什么区别#xff1f;其底层实现是什么#xff1f;
区别 #xff1a;
HashMap⽅法没有synchronized修饰#xff0c;线程⾮安全#xff0c;HashTable线程安全#xff1b;HashMap允许key和value为null#xff0c;⽽HashTable不允许
底层实现…
第一题. HashMap和HashTable有什么区别其底层实现是什么
区别
HashMap⽅法没有synchronized修饰线程⾮安全HashTable线程安全HashMap允许key和value为null⽽HashTable不允许
底层实现数组链表实现jdk8开始链表⾼度到8、数组⻓度超过64链表转变为红⿊树元素以内部类Node节点存在 3. 计算key的hash值⼆次hash然后对数组⻓度取模对应到数组下标 4. 如果没有产⽣hash冲突(下标位置没有元素)则直接创建Node存⼊数组 5. 如果产⽣hash冲突先进⾏equal⽐较相同则取代该元素不同则判断链表⾼度插⼊链表链表⾼度达到8并且数组⻓度到64则转变为红⿊树⻓度低于6则将红⿊树转回链表 6. key为null存在下标0的位置
第二题.谈谈ConcurrentHashMap的扩容机制
1.7版本
1.7版本的ConcurrentHashMap是基于Segment分段实现的每个Segment相对于⼀个⼩型的HashMap每个Segment内部会进⾏扩容和HashMap的扩容逻辑类似先⽣成新的数组然后转移元素到新数组中扩容的判断也是每个Segment内部单独判断的判断是否超过阈值
1.8版本 6. 1.8版本的ConcurrentHashMap不再基于Segment实现 7. 当某个线程进⾏put时如果发现ConcurrentHashMap正在进⾏扩容那么该线程⼀起进⾏扩容 8. 如果某个线程put时发现没有正在进⾏扩容则将key-value添加到ConcurrentHashMap中然后判断是否超过阈值超过了则进⾏扩容 9. ConcurrentHashMap是⽀持多个线程同时扩容的 10. 扩容之前也先⽣成⼀个新的数组 11. 在转移元素时先将原数组分组将每组分给不同的线程来进⾏元素的转移每个线程负责⼀组或多组的元素转移⼯作
第三题. Jdk1.7到Jdk1.8 HashMap 发⽣了什么变化(底层)?
1.7中底层是数组链表1.8中底层是数组链表红⿊树加红⿊树的⽬的是提⾼HashMap插⼊和查询整体效率1.7中链表插⼊使⽤的是头插法1.8中链表插⼊使⽤的是尾插法因为1.8中插⼊key和value时需要判断链表元素个数所以需要遍历链表统计链表元素个数所以正好就直接使⽤尾插法1.7中哈希算法⽐较复杂存在各种右移与异或运算1.8中进⾏了简化因为复杂的哈希算法的⽬的就是提⾼散列性来提供HashMap的整体效率⽽1.8中新增了红⿊树所以可以适当的简化哈希算法节省CPU资源
第四题. 说⼀下HashMap的Put⽅法
先说HashMap的Put⽅法的⼤体流程
根据Key通过哈希算法与与运算得出数组下标如果数组下标位置元素为空则将key和value封装为Entry对象JDK1.7中是Entry对象JDK1.8中 是Node对象并放⼊该位置如果数组下标位置元素不为空则要分情况讨论
如果是JDK1.7则先判断是否需要扩容如果要扩容就进⾏扩容如果不⽤扩容就⽣成Entry 对象并使⽤头插法添加到当前位置的链表中如果是JDK1.8则会先判断当前位置上的Node的类型看是红⿊树Node还是链表Node 如果是红⿊树Node则将key和value封装为⼀个红⿊树节点并添加到红⿊树中去在这个 过程中会判断红⿊树中是否存在当前key如果存在则更新value如果此位置上的Node对象是链表节点则将key和value封装为⼀个链表Node并通过尾插法插⼊到链表的最后位置去因为是尾插法所以需要遍历链表在遍历链表的过程中会判断是否存在当前key如果存在则更新value当遍历完链表后将新链表Node插⼊到链表中插⼊到链表后会看当前链表的节点个数如果⼤于等于8那么则会将该链表转成红⿊树将key和value封装为Node插⼊到链表或红⿊树中后再判断是否需要进⾏扩容如果需要就扩容如果不需要就结束PUT⽅法
第五题. HashMap的扩容机制原理
1.7版本
先⽣成新数组遍历⽼数组中的每个位置上的链表上的每个元素取每个元素的key并基于新数组⻓度计算出每个元素在新数组中的下标将元素添加到新数组中去所有元素转移完了之后将新数组赋值给HashMap对象的table属性
1.8版本
先⽣成新数组遍历⽼数组中的每个位置上的链表或红⿊树如果是链表则直接将链表中的每个元素重新计算下标并添加到新数组中去如果是红⿊树则先遍历红⿊树先计算出红⿊树中每个元素对应在新数组中的下标位置 a. 统计每个下标位置的元素个数 b. 如果该位置下的元素个数超过了8则⽣成⼀个新的红⿊树并将根节点的添加到新数组的对应位置 c. 如果该位置下的元素个数没有超过8那么则⽣成⼀个链表并将链表的头节点添加到新数组的对应位置所有元素转移完了之后将新数组赋值给HashMap对象的table属性
如果我的内容对你有帮助请点赞评论收藏。创作不易大家的支持就是我坚持下去的动力