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

制作企业网站要多少钱西宁站 网站

制作企业网站要多少钱,西宁站 网站,河南智慧团建登录入口,网站创建服务公司系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么#xff1f;4、你知道 hash 的实现吗#xff1f;为什么要这样实现#xff1f;5、为什么要用异或运算符#xff1f;6、HashMap 的 table 的容量如何确定#xff1f;l…系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么4、你知道 hash 的实现吗为什么要这样实现5、为什么要用异或运算符6、HashMap 的 table 的容量如何确定loadFactor 是什么该容量如何变化这种变化会带来什么问题7、HashMap中put方法的过程8、数组扩容的过程9、拉链法导致的链表过深问题为什么不用二叉查找树代替而选择红黑树为什么不一直使用红黑树10、说说你对红黑树的见解11、jdk8中对HashMap做了哪些改变12、HashMapLinkedHashMapTreeMap 有什么区别13、HashMap TreeMap LinkedHashMap 使用场景14、HashMap 和 HashTable 有什么区别15、HashMap ConcurrentHashMap 的区别16、为什么 ConcurrentHashMap 比 HashTable 效率要高17、ConcurrentHashMap 在 JDK 1.8 中为什么要使用内置锁 synchronized 来代替重入锁 ReentrantLock18、ConcurrentHashMap 简单介绍19、ConcurrentHashMap 的并发度是什么 前言 HashMap原理以及使用 1、数据结构 哈希表结构链表散列数组单向链表实现结合数组和链表的优点当链表长度超过8数组长度达到64时链表会转换为红黑树。 2、工作原理 HashMap底层是hash数组和单向链表实现数组中的每个元素都是链表由Node内部类实现Map.Entry接口实现HashMap通过put和get方法存储和获取。 存储对象时将K/V键值传给put方法 1调用 hash(K) 方法计算 K 的 hash 值然后结合数组长度计算得数组下标 2调用resize调整数组大小当容器中的元素个数大于 capacity * loadfactor 时容器会进行扩容resize 为 2n 3i.如果 K 的 hash 值在 HashMap 中不存在则执行插入若存在则发生碰撞 ii.如果 K 的 hash 值在 HashMap 中存在且它们两者 equals 返回 true则更新键值对 iii. 如果 K 的 hash 值在 HashMap 中存在且它们两者 equals 返回 false则插入链表的尾部尾插法或者红黑树中树的添加方式。JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法注意当碰撞导致链表大于 TREEIFY_THRESHOLD 8 时数组长度达到64时就把链表转换成红黑树获取对象时 将 K 传给 get() 方法①、调用 hash(K) 方法计算 K 的 hash 值从而获取该键值所在链表的数组下标②、顺序遍历链表equals()方法查找相同 Node 链表中 K 值对应的 V 值。 3、当两个对象的 hashCode 相同会发生什么 hashCode用来计算元素下标确定在数组中位置的hashCode 相同但Key不一定就是相等的equals方法比较两个不同的Key计算出相同的hashCode值就会发生碰撞。因此 HashMap 使用链表存储hash冲突的对象。因此当我们确定或设计Key的时候尽量确保唯一性尤其是自定义对象作为key时重写hashCode和equals方法确保唯一性。 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 ④、如果数据很大的情况下扩展时将会带来性能的损失在性能要求很高的地方这种损失很可能很致命。 HashMap容量为什么总是为2的次幂 满足(n - 1) hash保证索引值肯定不会超过数组长度n且计算快 7、HashMap中put方法的过程 8、数组扩容的过程 创建一个新的数组其容量为旧数组的两倍并重新计算旧数组中结点的存储位置。 9、拉链法导致的链表过深问题为什么不用二叉查找树代替而选择红黑树为什么不一直使用红黑树 之所以选择红黑树是为了解决二叉查找树的缺陷二叉查找树在特殊情况下会变成一条线性结构这就跟原来使用链表结构一样了造成很深的问题遍历查找会非常慢。 不一直使用红黑树是因为相同hash冲突很少时链表遍历查询更快。而红黑树在插入新数据后可能需要通过左旋右旋、变色这些操作来保持平衡引入红黑树就是为了查找数据快解决链表查询深度的问题我们知道红黑树属于平衡二叉树但是为了保持“平衡”是需要付出代价的但是该代价所损耗的资源要比遍历线性链表要少所以当长度大于8的时候会使用红黑树如果链表长度很短的话根本不需要引入红黑树引入反而会慢。 10、说说你对红黑树的见解 每个节点非红即黑 根节点总是黑色的 如果节点是红色的则它的子节点必须是黑色的反之不一定 每个叶子节点都是黑色的空节点NIL节点 从根节点到叶节点或空子节点的每条路径必须包含相同数目的黑色节点即相同的黑色高度 11、jdk8中对HashMap做了哪些改变 在java 1.8中如果链表的长度超过了8那么链表将转换为红黑树。 发生hash碰撞时java 1.7 会在链表的头部插入而java 1.8会在链表的尾部插入 在java 1.8中Entry被Node替代(换了一个马甲)。 12、HashMapLinkedHashMapTreeMap 有什么区别 LinkedHashMap 保存了记录的插入顺序在用 Iterator 遍历时先取到的记录肯定是先插入的遍历比 HashMap 慢 TreeMap 实现 SortMap 接口能够把它保存的记录根据键排序默认按键值升序排序也可以指定排序的比较器 13、HashMap TreeMap LinkedHashMap 使用场景 HashMap在 Map 中插入、删除和定位元素时 TreeMap在需要按自然顺序或自定义顺序遍历键的情况下 LinkedHashMap在需要输出的顺序和输入的顺序相同的情况下。 14、HashMap 和 HashTable 有什么区别 ①、HashMap 是线程不安全的HashTable 是线程安全的 ②、由于线程安全所以 HashTable 的效率比不上 HashMap ③、HashMap最多只允许一条记录的键为null允许多条记录的值为null而 HashTable不允许 ④、HashMap 默认初始化数组的大小为16HashTable 为 11前者扩容时扩大两倍后者扩大两倍1 ⑤、HashMap 需要重新计算 hash 值而 HashTable 直接使用对象的 hashCode 15、HashMap ConcurrentHashMap 的区别 ConcurrentHashMap 类是 Java并发包 java.util.concurrent 中提供的一个线程安全且高效的 HashMap 实现。 HashTable 是使用 synchronize 关键字加锁的原理就是对对象加锁 而针对 ConcurrentHashMap在 JDK 1.7 中采用 分段锁的方式JDK 1.8 中直接采用了CAS无锁算法 synchronized。 除了加锁原理上无太大区别。另外HashMap 的键值对允许有null但是ConCurrentHashMap 都不允许。 16、为什么 ConcurrentHashMap 比 HashTable 效率要高 HashTable 使用一把锁锁住整个链表结构处理并发问题多个线程竞争一把锁容易阻塞 ConcurrentHashMap JDK 1.7 中使用分段锁ReentrantLock Segment HashEntry相当于把一个 HashMap 分成多个段每段分配一把锁这样支持多线程访问。锁粒度基于 Segment包含多个 HashEntry。 JDK 1.8 中使用 CAS synchronized Node 红黑树。锁粒度Node首结点实现 Map.Entry。锁粒度降低了 17、ConcurrentHashMap 在 JDK 1.8 中为什么要使用内置锁 synchronized 来代替重入锁 ReentrantLock ①、粒度降低了 ②、JVM 开发团队没有放弃 synchronized而且基于 JVM 的 synchronized 优化空间更大更加自然。 ③、在大量的数据操作下对于 JVM 的内存压力基于 API 的 ReentrantLock 会开销更多的内存。 18、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。 19、ConcurrentHashMap 的并发度是什么 程序运行时能够同时更新 ConccurentHashMap 且不产生锁竞争的最大线程数。默认为 16且可以在构造函数中设置。 当用户设置并发度时ConcurrentHashMap 会使用大于等于该值的最小2幂指数作为实际并发度假如用户设置并发度为17实际并发度则为32 ---- 永不磨灭的番号AK
http://www.ho-use.cn/article/10819348.html

相关文章:

  • 青浦网站设计大连工程信息招标网
  • 上海网络平台网站阜阳建设网站
  • 重庆网站建设cqsday网站内容页优化
  • 工信部网站备案平台wordpress相似推荐
  • 中国建设银行网站查询密码是什么深圳网站优化包年
  • 随州网站建设外包公司青岛网络营销网络推广介绍
  • 网站的标题怎么做吸引人网站建设 设计方案 百度文库
  • wordpress旅游网站主题论述制作网站的一般过程
  • 江苏省城市建设信用手册网站茂名网站建设哪家好
  • 重庆大坪网站建设泉州市第一建设有限公司网站
  • 大理市城乡建设局网站怎样查网站用什么程序做的
  • 家具网站建设需求网站建设福建
  • 做3ds磁铁卡网站上海闵行区租房价格
  • 专业的营销网站建设公司怎样进入建设通网站
  • 网站开发实训h5总结安泽网站建设
  • 如何做外链河南网站优化
  • seo怎么做自己的网站做产品目录设计用什么网站好
  • 2015年网站设计高端品牌名字怎么取
  • 网站制作代理平台大连工业大学研究生
  • 淮安做微信网站别人做的网站域名到期怎么办
  • 美食网站建设页面要求政务网站建设目标和核心功能
  • 提供温州手机网站制作多少钱怎么做二维码进入公司网站
  • 做消费金融网站有没有接单做加工的网站
  • 深圳外贸网站建设口报关企业风险查询平台
  • 淄博网站成功案例wordpress免邮箱注册
  • vue网站开发实例毕业去设计公司还是企业
  • 微网站自助建站手机网站建设图片
  • 外国有没有中国代做数学作业的网站长沙传媒公司招聘信息
  • 网站开发的项目需求网站建设系统 开源
  • 网站收录不增加黄骅港招聘