当前位置: 首页 > news >正文

闵行三中网站wordpress停用谷歌字体

闵行三中网站,wordpress停用谷歌字体,小程序登录入口qq浏览器,网页微信版本Java面试笔试面经、Java技术每天学习一点Java面试关注不迷路作者#xff1a;菜鸟小于来源#xff1a;https://www.cnblogs.com/Young111/p/11519952.html1#xff1a;HashMap 的数据结构#xff1f;A#xff1a;哈希表结构(链表散列#xff1a;数组链表)实现#xff0c;… Java面试笔试面经、Java技术每天学习一点Java面试关注不迷路作者菜鸟小于来源https://www.cnblogs.com/Young111/p/11519952.html1HashMap 的数据结构A哈希表结构(链表散列数组链表)实现结合数组和链表的优点。当链表长度超过 8 时链表转换为红黑树。transient NodeK,V\[\] table;2HashMap 的工作原理HashMap 底层是 hash 数组和单向链表实现数组中的每个元素都是链表由 Node 内部类(实现 Map.Entry接口)实现HashMap 通过 put get 方法存储和获取。存储对象时将 K/V 键值传给 put() 方法①、调用 hash(K) 方法计算 K 的 hash 值然后结合数组长度计算得数组下标②、调整数组大小(当容器中的元素个数大于 capacity * loadfactor 时容器会进行扩容resize 为 2n)③、i.如果 K 的 hash 值在 HashMap 中不存在则执行插入若存在则发生碰撞ii.如果 K 的 hash 值在 HashMap 中存在且它们两者 equals 返回 true则更新键值对iii. 如果 K 的 hash 值在 HashMap 中存在且它们两者 equals 返回 false则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。(JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)(注意当碰撞导致链表大于 TREEIFY_THRESHOLD 8 时就把链表转换成红黑树)获取对象时将 K 传给 get() 方法①、调用 hash(K) 方法(计算 K 的 hash 值)从而获取该键值所在链表的数组下标②、顺序遍历链表equals()方法查找相同 Node 链表中 K 值对应的 V 值。hashCode 是定位的存储位置equals是定性的比较两者是否相等。3.当两个对象的 hashCode 相同会发生什么因为 hashCode 相同不一定就是相等的(equals方法比较)所以两个对象所在数组的下标相同碰撞就此发生。又因为 HashMap 使用链表存储对象这个 Node 会存储到链表中。4.你知道 hash 的实现吗为什么要这样实现JDK 1.8 中是通过 hashCode() 的高 16 位异或低 16 位实现的(h k.hashCode()) ^ (h 16)主要是从速度功效和质量来考虑的减少系统的开销也不会造成因为高位没有参与下标的计算从而引起的碰撞。5.为什么要用异或运算符保证了对象的 hashCode 的 32 位值只要有一位发生改变整个 hash() 返回值就会改变。尽可能的减少碰撞。6.HashMap 的 table 的容量如何确定loadFactor 是什么该容量如何变化这种变化会带来什么问题①、table 数组大小是由 capacity 这个参数确定的默认是16也可以构造时传入最大限制是130②、loadFactor 是装载因子主要目的是用来确认table 数组是否需要动态扩展默认值是0.75比如table 数组大小为 16装载因子为 0.75 时threshold 就是12当 table 的实际大小超过 12 时table就需要动态扩容③、扩容时调用 resize() 方法将 table 长度变为原来的两倍(注意是 table 长度而不是 threshold)④、如果数据很大的情况下扩展时将会带来性能的损失在性能要求很高的地方这种损失很可能很致命。 7.HashMap中put方法的过程答“调用哈希函数获取Key对应的hash值再计算其数组下标如果没有出现哈希冲突则直接放入数组如果出现哈希冲突则以链表的方式放在链表后面如果链表长度超过阀值( TREEIFY THRESHOLD8)就把链表转成红黑树链表长度低于6就把红黑树转回链表;如果结点的key已经存在则替换其value即可如果集合中的键值对大于12调用resize方法进行数组扩容。”8.数组扩容的过程创建一个新的数组其容量为旧数组的两倍并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种原下标位置或原下标旧数组的大小。9.拉链法导致的链表过深问题为什么不用二叉查找树代替而选择红黑树为什么不一直使用红黑树之所以选择红黑树是为了解决二叉查找树的缺陷二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了造成很深的问题)遍历查找会非常慢。而红黑树在插入新数据后可能需要通过左旋右旋、变色这些操作来保持平衡引入红黑树就是为了查找数据快解决链表查询深度的问题我们知道红黑树属于平衡二叉树但是为了保持“平衡”是需要付出代价的但是该代价所损耗的资源要比遍历线性链表要少所以当长度大于8的时候会使用红黑树如果链表长度很短的话根本不需要引入红黑树引入反而会慢。10.说说你对红黑树的见解每个节点非红即黑根节点总是黑色的如果节点是红色的则它的子节点必须是黑色的(反之不一定)每个叶子节点都是黑色的空节点(NIL节点)从根节点到叶节点或空子节点的每条路径必须包含相同数目的黑色节点(即相同的黑色高度)11.jdk8中对HashMap做了哪些改变在java 1.8中如果链表的长度超过了8那么链表将转换为红黑树。(桶的数量必须大于64小于64的时候只会扩容)发生hash碰撞时java 1.7 会在链表的头部插入而java 1.8会在链表的尾部插入在java 1.8中Entry被Node替代(换了一个马甲)。12.HashMapLinkedHashMapTreeMap 有什么区别LinkedHashMap 保存了记录的插入顺序在用 Iterator 遍历时先取到的记录肯定是先插入的遍历比 HashMap 慢TreeMap 实现 SortMap 接口能够把它保存的记录根据键排序(默认按键值升序排序也可以指定排序的比较器)13.HashMap TreeMap LinkedHashMap 使用场景一般情况下使用最多的是 HashMap。HashMap在 Map 中插入、删除和定位元素时TreeMap在需要按自然顺序或自定义顺序遍历键的情况下LinkedHashMap在需要输出的顺序和输入的顺序相同的情况下。14.HashMap 和 HashTable 有什么区别①、HashMap 是线程不安全的HashTable 是线程安全的②、由于线程安全所以 HashTable 的效率比不上 HashMap③、HashMap最多只允许一条记录的键为null允许多条记录的值为null而 HashTable不允许④、HashMap 默认初始化数组的大小为16HashTable 为 11前者扩容时扩大两倍后者扩大两倍1⑤、HashMap 需要重新计算 hash 值而 HashTable 直接使用对象的 hashCode15.Java 中的另一个线程安全的与 HashMap 极其类似的类是什么同样是线程安全它与 HashTable 在线程同步上有什么不同ConcurrentHashMap 类(是 Java并发包 java.util.concurrent 中提供的一个线程安全且高效的 HashMap 实现)。HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁)而针对 ConcurrentHashMap在 JDK 1.7 中采用 分段锁的方式JDK 1.8 中直接采用了CAS(无锁算法) synchronized。16.HashMap ConcurrentHashMap 的区别除了加锁原理上无太大区别。另外HashMap 的键值对允许有null但是ConCurrentHashMap 都不允许。17.为什么 ConcurrentHashMap 比 HashTable 效率要高HashTable 使用一把锁(锁住整个链表结构)处理并发问题多个线程竞争一把锁容易阻塞ConcurrentHashMapJDK 1.7 中使用分段锁(ReentrantLock Segment HashEntry)相当于把一个 HashMap 分成多个段每段分配一把锁这样支持多线程访问。锁粒度基于 Segment包含多个 HashEntry。JDK 1.8 中使用 CAS synchronized Node 红黑树。锁粒度Node(首结点)(实现 Map.Entry)。锁粒度降低了。18.针对 ConcurrentHashMap 锁机制具体分析(JDK 1.7 VS JDK 1.8)JDK 1.7 中采用分段锁的机制实现并发的更新操作底层采用数组链表的存储结构包括两个核心静态内部类 Segment 和 HashEntry。①、Segment 继承 ReentrantLock(重入锁) 用来充当锁的角色每个 Segment 对象守护每个散列映射表的若干个桶②、HashEntry 用来封装映射表的键-值对③、每个桶是由若干个 HashEntry 对象链接起来的链表JDK 1.8 中采用Node CAS Synchronized来保证并发安全。取消类 Segment直接用 table 数组存储键值对当 HashEntry 对象组成的链表长度超过 TREEIFY_THRESHOLD 时链表转换为红黑树提升性能。底层变更为数组 链表 红黑树。19.ConcurrentHashMap 在 JDK 1.8 中为什么要使用内置锁 synchronized 来代替重入锁 ReentrantLock①、粒度降低了②、JVM 开发团队没有放弃 synchronized而且基于 JVM 的 synchronized 优化空间更大更加自然。③、在大量的数据操作下对于 JVM 的内存压力基于 API 的 ReentrantLock 会开销更多的内存。20.ConcurrentHashMap 简单介绍①、重要的常量private transient volatile int sizeCtl;当为负数时-1 表示正在初始化-N 表示 N - 1 个线程正在进行扩容当为 0 时表示 table 还没有初始化当为其他正数时表示初始化或者下一次进行扩容的大小。②、数据结构Node 是存储结构的基本单元继承 HashMap 中的 Entry用于存储数据TreeNode 继承 Node但是数据结构换成了二叉树结构是红黑树的存储结构用于红黑树中存储数据TreeBin 是封装 TreeNode 的容器提供转换红黑树的一些条件和锁的控制。③、存储对象时(put() 方法)如果没有初始化就调用 initTable() 方法来进行初始化如果没有 hash 冲突就直接 CAS 无锁插入如果需要扩容就先进行扩容如果存在 hash 冲突就加锁来保证线程安全两种情况一种是链表形式就直接遍历到尾端插入一种是红黑树就按照红黑树结构插入如果该链表的数量大于阀值 8就要先转换成红黑树的结构break 再一次进入循环如果添加成功就调用 addCount() 方法统计 size并且检查是否需要扩容。④、扩容方法 transfer()默认容量为 16扩容时容量变为原来的两倍。helpTransfer()调用多个工作线程一起帮助进行扩容这样的效率就会更高。⑤、获取对象时(get()方法)计算 hash 值定位到该 table 索引位置如果是首结点符合就返回如果遇到扩容时会调用标记正在扩容结点 ForwardingNode.find()方法查找该结点匹配就返回以上都不符合的话就往下遍历结点匹配就返回否则最后就返回 null。21.ConcurrentHashMap 的并发度是什么程序运行时能够同时更新 ConccurentHashMap 且不产生锁竞争的最大线程数。默认为 16且可以在构造函数中设置。当用户设置并发度时ConcurrentHashMap 会使用大于等于该值的最小2幂指数作为实际并发度(假如用户设置并发度为17实际并发度则为32)
http://www.lebaoying.cn/news/40025.html

相关文章:

  • 谷歌做自己的网站广西翔路建设有限责任公司网站
  • 昆山门户网站网站图片自动下载
  • 企业vi怎么设计北京seo网站管理
  • 网站建设 用什么语言wordpress如何添加自定义字段
  • 制作网站赚钱吗创意网络
  • 网站伪静态好还是静态好wordpress 多媒体尺寸
  • 自己做的网站打不开了简易网址制作
  • 招聘网站费用怎么做分录深圳全网营销网站
  • 三合一网站有必要吗长沙人才市场招聘网最新招聘
  • a3网站建设网站显示已备案
  • 后缀的域名暂无法进行网站备案网站收录提交接口
  • 图片外链生成宁波抖音seo公司
  • 工业设计网站外网广州菜谱制作公司
  • php开发网站建设书籍iis7 网站防盗链
  • 广州市网站建设 合优网站可以同时做竞价和优化吗
  • 打开网站访问慢免费空间凡科
  • 徐州机票网站开发100个销售技巧和话术
  • 杭州91网站建设赣州网络问政
  • 音乐 版权 做视频网站专业的免费网站建设
  • 制作网站教程国外做giveaway的网站
  • 国外网站开发技术现状学校网页制作视频教程
  • 做电子商务网站 语言开发公司解除前期物业服务合同
  • 建立网站的第一步是建立什么网站建设费入什么科目
  • 公司网站开发的核心技术福建省建设安全监督站的网站
  • 句容网站定制推广软件公司
  • 网站地图制作怎么做项目代理
  • 网站注册表单怎么做国家工商官网查询
  • 在百度云上建设网站wordpress系统语言设置中文乱码
  • 网站字体设计规范沧州小程序开发制作
  • 网站配色案例有做彩票网站平台的吗