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

网站改版流程成都十大设计工作室

网站改版流程,成都十大设计工作室,苏州专业做网站,wordpress 修改主题页面HashSet 如何检查重复? 当你把对象加入HashSet时#xff0c;HashSet 会先计算对象的hashcode值来判断对象加入的位置#xff0c;同时也会与其他加入的对象的 hashcode 值作比较#xff0c;如果没有相符的 hashcode#xff0c;HashSet 会假设对象没有重复出现。但是如果发…HashSet 如何检查重复? 当你把对象加入HashSet时HashSet 会先计算对象的hashcode值来判断对象加入的位置同时也会与其他加入的对象的 hashcode 值作比较如果没有相符的 hashcodeHashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象这时会调用equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同HashSet 就不会让加入操作成功。 在 JDK1.8 中HashSet的add()方法只是简单的调用了HashMap的put()方法并且判断了一下返回值以确保是否有重复元素。直接看一下HashSet中的源码 // Returns: true if this set did not already contain the specified element // 返回值当 set 中没有包含 add 的元素时返回真 public boolean add(E e) {return map.put(e, PRESENT)null; } 而在HashMap的putVal()方法中也能看到如下说明 // Returns : previous value, or null if none // 返回值如果插入位置没有元素返回null否则返回上一个元素 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) { ... } 也就是说在 JDK1.8 中实际上无论HashSet中是否已经存在了某元素HashSet都会直接插入只是会在add()方法的返回值处告诉我们插入前是否存在相同元素。 HashMap 的底层实现 JDK1.8 之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值然后通过 (n - 1) hash 判断当前元素存放的位置这里的 n 指的是数组的长度如果当前位置存在元素的话就判断该元素与要存入的元素的 hash 值以及 key 是否相同如果相同的话直接覆盖不相同就通过拉链法解决冲突。 HashMap 中的扰动函数hash 方法是用来优化哈希值的分布。通过对原始的 hashCode() 进行额外处理扰动函数可以减小由于糟糕的 hashCode() 实现导致的碰撞从而提高数据的分布均匀性。 JDK 1.8 HashMap 的 hash 方法源码: JDK 1.8 的 hash 方法 相比于 JDK 1.7 hash 方法更加简化但是原理不变。 static final int hash(Object key) {int h;// key.hashCode()返回散列值也就是hashcode// ^按位异或// :无符号右移忽略符号位空位都以0补齐return (key null) ? 0 : (h key.hashCode()) ^ (h 16);} 对比一下 JDK1.7 的 HashMap 的 hash 方法源码. static int hash(int h) {// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^ (h 20) ^ (h 12);return h ^ (h 7) ^ (h 4); } 相比于 JDK1.8 的 hash 方法 JDK 1.7 的 hash 方法的性能会稍差一点点因为毕竟扰动了 4 次。 所谓 “拉链法” 就是将链表和数组相结合。也就是说创建一个链表数组数组中每一格就是一个链表。若遇到哈希冲突则将冲突的值加到链表中即可。 JDK1.8 之后 相比于之前的版本 JDK1.8 之后在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为 8将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树时将链表转化为红黑树以减少搜索时间。 TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底层都用到了红黑树。红黑树就是为了解决二叉查找树的缺陷因为二叉查找树在某些情况下会退化成一个线性结构。 我们来结合源码分析一下 HashMap 链表到红黑树的转换。 1、 putVal 方法中执行链表转红黑树的判断逻辑。 链表的长度大于 8 的时候就执行 treeifyBin 转换红黑树的逻辑。 // 遍历链表 for (int binCount 0; ; binCount) {// 遍历到链表最后一个节点if ((e p.next) null) {p.next newNode(hash, key, value, null);// 如果链表元素个数大于TREEIFY_THRESHOLD8if (binCount TREEIFY_THRESHOLD - 1) // -1 for 1st// 红黑树转换并不会直接转换成红黑树treeifyBin(tab, hash);break;}if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))break;p e; } 2、treeifyBin 方法中判断是否真的转换为红黑树。 final void treeifyBin(NodeK,V[] tab, int hash) {int n, index; NodeK,V e;// 判断当前数组的长度是否小于 64if (tab null || (n tab.length) MIN_TREEIFY_CAPACITY)// 如果当前数组的长度小于 64那么会选择先进行数组扩容resize();else if ((e tab[index (n - 1) hash]) ! null) {// 否则才将列表转换为红黑树TreeNodeK,V hd null, tl null;do {TreeNodeK,V p replacementTreeNode(e, null);if (tl null)hd p;else {p.prev tl;tl.next p;}tl p;} while ((e e.next) ! null);if ((tab[index] hd) ! null)hd.treeify(tab);} } 将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树。
http://www.w-s-a.com/news/220561/

相关文章:

  • 如何制作个人作品网站宣传片拍摄合同
  • 关于微网站策划ppt怎么做做插画的网站
  • 做设计网上揽活哪个网站最好中企动力算大厂吗
  • 电子商务网站开发常用工具牡丹江吧
  • 四川成都网站制作公司wordpress 获取某个分类的文章
  • wordpress 编辑器推动门户网站建设不断优化升级
  • 做游戏网站的前景温江区建设局网站
  • 济南做微网站推广做网站seo优化总结
  • 巢湖网站建设电话长沙大型互联网公司
  • wordpress站群主机海南人
  • 云南网站建设维护商业网站建设教程
  • 云南省滇中引水工程建设管理局网站jsp个人网站设计
  • 网站建设 域名业务 邮箱互联网装饰网站
  • 建设厅技工在哪个网站上查询有了网站模板 还要怎样做
  • 城市联盟网站怎么做百度云网站建设视频教程
  • 织梦cms 官方网站网页视频如何下载到电脑
  • 查询建设公司业绩网站国外外链平台
  • 搭建直播网站需要怎么做做石材网站步骤
  • 移动网站如何做权重wordpress 统计字数 插件
  • 编写网站的软件百度指数教程
  • 网站改版建议策划书做设计什么兼职网站
  • 北京做兼职网站文创产品设计流程
  • 南阳做玉器网站wordpress 图片被缩小
  • 自己做网站卖衣服cms做网站容易不
  • 安徽安搜做的网站怎么样手机网站商城建设答辩问题
  • 分析不同网站的优缺点房产网站定制
  • 深圳工业设计大展2021论坛与网站做优化哪个更好
  • 什么网站做招聘比较好网络营销渠道管理
  • 网站建设选择什么模式淘宝网站可以做轮播吗
  • 山西免费网站制作乌市高新区建设局网站